C#でBase64変換する方法|文字列・ファイルのエンコード/デコードとエラー対策

はじめに

C#でBase64変換を行う場面は、文字列の受け渡し、画像やPDFの埋め込み、API通信、ファイル保存など幅広くあります。特に「c# base64」の実装は、Convert クラスと Encoding クラスを理解すると、驚くほどシンプルに扱えます。

この記事では、C#でBase64をエンコード・デコードする基本から、ファイル変換、エラー対策、Base64UrlやData URIの処理、実務で使いやすいユーティリティ化まで、順番にわかりやすく解説します。

1. C#のBase64変換でできること

1-1. Base64とは何か

Base64は、バイナリデータをASCII文字列として表現するためのエンコード方式です。データそのものを暗号化するわけではなく、メールやJSON、URLなど文字列として扱いたい場面で使われます。

たとえば画像ファイルやPDFのようなバイナリデータを、文字列として安全に送信・保存したいときに便利です。

1-2. C#でBase64を扱う主な場面

C#でBase64を使う主な場面は次の通りです。

・文字列をAPI送信用に変換する
・画像をHTMLやJSONに埋め込む
・PDFやZIPを文字列として保存する
・メール添付やWeb通信でファイルを扱う
・JWTやトークンの一部を処理する

特にWeb APIでは、画像やファイルをBase64文字列にして送る実装がよく使われます。

1-3. 文字列・画像・PDF・任意ファイルの変換の違い

文字列をBase64にする場合は、まず文字列をバイト配列に変換してからBase64化します。
一方、画像・PDF・ZIPなどのファイルは、最初からバイナリデータなので、そのまま byte[] としてBase64に変換できます。

つまり、流れは次のように違います。

・文字列 → 文字コードで byte[] 化 → Base64
・ファイル → byte[] 読み込み → Base64

1-4. エンコードとデコードの違い

エンコードは、元データをBase64文字列に変換することです。
デコードは、Base64文字列を元のバイト配列や文字列に戻すことです。

C#では、次の2つが基本になります。

・エンコード: Convert.ToBase64String()
・デコード: Convert.FromBase64String()

2. C#で文字列をBase64エンコードする方法

2-1. Convert.ToBase64Stringを使った基本コード

C#で文字列をBase64に変換する基本は、文字列を byte[] にしてから Convert.ToBase64String() を使う方法です。

C#
using System;
using System.Text;

class Program
{
static void Main()
{
string text = "Hello C# Base64";
byte[] bytes = Encoding.UTF8.GetBytes(text);
string base64 = Convert.ToBase64String(bytes);

Console.WriteLine(base64);
}
}

このコードでは、文字列をUTF-8のバイト配列へ変換し、その後Base64文字列にしています。

2-2. UTF-8文字列をBase64に変換する

文字列を扱うときは、基本的にUTF-8を使うのが安全です。日本語を含む文字列でも文字化けしにくく、WebやAPIとの相性も良いからです。

C#
string text = "こんにちは、C#";
string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(text));
Console.WriteLine(base64);

UTF-8を前提にしておけば、後でデコードする側でも同じ文字コードを使いやすくなります。

2-3. 日本語文字列を安全にエンコードするポイント

日本語文字列をBase64にする場合、重要なのは「Base64自体ではなく、元の文字コード」です。
Base64はバイト列を文字列化しているだけなので、元データがどの文字コードで作られたかが正しくないと、復元時に文字化けします。

日本語を安全に扱うなら、次のようにUTF-8を使うのが基本です。

C#
string text = "日本語の文字列";
string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(text));

2-4. Encoding.UTF8.GetBytesの役割

Encoding.UTF8.GetBytes() は、文字列をUTF-8のバイト配列に変換するメソッドです。
Base64変換では、このバイト配列が入力になります。

つまり、Convert.ToBase64String() は文字列を直接受け取れないため、先に GetBytes()byte[] に変える必要があります。

2-5. ASCII・Shift_JIS・UTF-8の使い分け

文字コードは用途に応じて使い分けます。

・ASCII: 英数字や記号のみなら軽量
・Shift_JIS: 古いWindows系システムとの互換性が必要な場合
・UTF-8: 現在のWeb開発や多言語対応で最も推奨

実務では、特別な理由がない限りUTF-8を使うのが無難です。文字コードが揃っていないと、Base64の復元時に文字化けの原因になります。

3. C#でBase64文字列をデコードする方法

3-1. Convert.FromBase64Stringを使った基本コード

Base64文字列を元に戻すには、Convert.FromBase64String() を使います。

C#
using System;
using System.Text;

class Program
{
static void Main()
{
string base64 = "SGVsbG8gQyMgQmFzZTY0";
byte[] bytes = Convert.FromBase64String(base64);
string text = Encoding.UTF8.GetString(bytes);

Console.WriteLine(text);
}
}

3-2. Base64から元の文字列に戻す手順

デコードは次の順番で行います。

  1. Base64文字列を Convert.FromBase64String()byte[] に戻す

  2. Encoding.UTF8.GetString() で文字列に戻す

この2段階を覚えておくと、文字列のエンコード・デコードを安定して扱えます。

3-3. Encoding.UTF8.GetStringの役割

Encoding.UTF8.GetString() は、UTF-8のバイト配列を文字列に戻すメソッドです。
Base64デコードの結果は単なる byte[] なので、それが文字列データならさらに GetString() が必要です。

3-4. 文字化けが起きる原因と対策

文字化けの主な原因は、エンコード時とデコード時の文字コードが一致していないことです。
たとえば、エンコード時にShift_JIS、デコード時にUTF-8を使うと、正しく戻りません。

対策はシンプルで、エンコードとデコードで同じ文字コードを使うことです。実務ではUTF-8で統一するのが基本です。

3-5. エンコード時とデコード時の文字コードを揃える

Base64は文字コードを保持しないため、元の文字コードを別途意識する必要があります。

C#
string original = "C#でBase64変換";
byte[] bytes = Encoding.UTF8.GetBytes(original);
string base64 = Convert.ToBase64String(bytes);

byte[] restoredBytes = Convert.FromBase64String(base64);
string restored = Encoding.UTF8.GetString(restoredBytes);

このように、前後で Encoding.UTF8 を揃えることが重要です。

4. C#でファイルをBase64エンコード/デコードする方法

4-1. File.ReadAllBytesでファイルをBase64化する

ファイルをBase64にする場合は、まず File.ReadAllBytes() でバイト配列として読み込みます。

C#
using System;
using System.IO;

class Program
{
static void Main()
{
string filePath = @"C:\temp\sample.pdf";
byte[] fileBytes = File.ReadAllBytes(filePath);
string base64 = Convert.ToBase64String(fileBytes);

Console.WriteLine(base64);
}
}

画像、PDF、ZIPなど、どのバイナリファイルでも同じ方法で扱えます。

4-2. Base64文字列をファイルに復元する

Base64文字列をファイルに戻すには、Convert.FromBase64String()byte[] に戻し、File.WriteAllBytes() で保存します。

C#
using System;
using System.IO;

class Program
{
static void Main()
{
string base64 = "iVBORw0KGgoAAAANSUhEUgAA...";
byte[] fileBytes = Convert.FromBase64String(base64);
File.WriteAllBytes(@"C:\temp\restored.png", fileBytes);
}
}

4-3. 画像ファイルをBase64に変換する

画像ファイルのBase64化は、WebページやAPIで画像を埋め込むときによく使われます。

C#
string path = @"C:\temp\image.png";
string base64 = Convert.ToBase64String(File.ReadAllBytes(path));

HTMLでは data:image/png;base64, の形式と組み合わせて使うこともあります。

4-4. PDFやZIPなどのバイナリファイルを扱う方法

PDFやZIPはテキストではなくバイナリファイルなので、文字列変換ではなく byte[] ベースで扱います。
流れは画像と同じで、ReadAllBytes() してBase64化し、復元時は WriteAllBytes() を使います。

4-5. File.WriteAllBytesで元ファイルとして保存する

Base64文字列を元ファイルへ戻す場合は、ファイル形式に合わせて拡張子を付けて保存します。

C#
string base64 = "...";
byte[] bytes = Convert.FromBase64String(base64);
File.WriteAllBytes(@"C:\temp\output.zip", bytes);

4-6. 大容量ファイルを扱うときの注意点

大きなファイルをBase64化すると、メモリ使用量が増えます。
さらにBase64は元データよりサイズが大きくなるため、数百MB以上のファイルでは負荷が高くなりやすいです。

大容量ファイルを扱う場合は、次の点に注意してください。

・一度に全読み込みしない設計を検討する
・API送信サイズ制限を確認する
・DB保存時の容量増加を見込む

5. C#でBase64変換時によくあるエラーと対策

5-1. FormatExceptionが発生する原因

Convert.FromBase64String() で最もよくあるのが FormatException です。
これは、入力文字列がBase64として正しくないときに発生します。

原因としては、不正な文字、改行や空白、パディング不足などが考えられます。

5-2. Base64文字列に不正な文字が含まれている場合

Base64文字列には、通常のBase64で使える文字以外が含まれているとエラーになります。
たとえば、URLエンコードされていない文字や、途中で改ざんされた文字列は失敗します。

デコード前に、余計な文字が混ざっていないか確認することが大切です。

5-3. パディング「=」が不足している場合

Base64では、末尾に = が付くことがあります。
これが不足していると、正しく復元できないことがあります。

特にBase64Url形式では = を省略することがあるため、通常のBase64に戻してからデコードする必要があります。

5-4. 改行・空白・余計なプレフィックスを取り除く方法

data:image/png;base64, のようなプレフィックスが付いた文字列をそのまま FromBase64String() に渡すとエラーになります。
同様に、改行や空白も取り除いたほうが安全です。

C#
string base64 = input
.Replace("data:image/png;base64,", "")
.Replace("\r", "")
.Replace("\n", "")
.Trim();

5-5. nullや空文字を安全に処理する方法

nullや空文字が入力される可能性があるなら、事前チェックを入れておくと安全です。

C#
if (string.IsNullOrWhiteSpace(base64))
{
return;
}

入力値の検証をしてからデコードすれば、例外を減らせます。

5-6. Try-catchでデコード失敗に備える実装例

Base64文字列が外部入力なら、try-catch を使って失敗に備えるのが実務的です。

C#
try
{
byte[] bytes = Convert.FromBase64String(base64);
string text = Encoding.UTF8.GetString(bytes);
}
catch (FormatException)
{
Console.WriteLine("Base64文字列が不正です。");
}

6. Base64UrlやData URIをC#で扱う方法

6-1. 通常のBase64とBase64Urlの違い

通常のBase64では +/= が使われます。
一方、Base64UrlではURLに使いやすいように文字が置き換えられ、+-/_ に変わることがあります。

URLパラメータやJWTでよく使われるのはBase64Urlです。

6-2. 「+」「/」「=」をURL向けに変換する方法

Base64Urlに変換するには、次のような置換を行います。

C#
string base64Url = base64
.Replace("+", "-")
.Replace("/", "_")
.TrimEnd('=');

通常のBase64に戻すときは、逆変換してパディングを補います。

C#
string base64 = base64Url
.Replace("-", "+")
.Replace("_", "/");

switch (base64.Length % 4)
{
case 2: base64 += "=="; break;
case 3: base64 += "="; break;
}

6-3. JWTやURLパラメータでBase64Urlが使われるケース

JWTはBase64Urlを使う代表的な例です。
URLにそのまま載せるデータや、+/ が問題になる場面ではBase64Urlが適しています。

6-4. data:image/png;base64,付き文字列を処理する方法

HTMLやAPIレスポンスでは、Base64文字列の前に data:image/png;base64, のようなヘッダが付くことがあります。
この場合、Base64本体だけを取り出してからデコードします。

C#
string input = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...";
string prefix = "base64,";
int index = input.IndexOf(prefix, StringComparison.OrdinalIgnoreCase);

string base64 = index >= 0 ? input[(index + prefix.Length)..] : input;
byte[] bytes = Convert.FromBase64String(base64);

6-5. Web APIでBase64を送受信するときの注意点

Web APIでBase64を使うときは、文字列サイズが大きくなりやすい点に注意が必要です。
JSONに直接埋め込む場合は、通信量が増え、レスポンスも重くなります。

また、Base64のまま保存すると、DBやログの容量も増えます。用途によっては、ファイルアップロード方式や圧縮を検討したほうがよい場合もあります。

7. 実務で使えるBase64変換のユーティリティ化

7-1. 文字列をBase64に変換する共通メソッド

実務では、毎回同じ処理を書くより、共通メソッドにしておくと便利です。

C#
using System.Text;

public static string ToBase64(string text)
{
if (text == null) return string.Empty;
return Convert.ToBase64String(Encoding.UTF8.GetBytes(text));
}

7-2. Base64を文字列に戻す共通メソッド

C#
using System.Text;

public static string FromBase64ToString(string base64)
{
if (string.IsNullOrWhiteSpace(base64)) return string.Empty;
byte[] bytes = Convert.FromBase64String(base64);
return Encoding.UTF8.GetString(bytes);
}

7-3. ファイルをBase64に変換する共通メソッド

C#
using System.IO;

public static string FileToBase64(string filePath)
{
if (!File.Exists(filePath)) return string.Empty;
return Convert.ToBase64String(File.ReadAllBytes(filePath));
}

7-4. Base64をファイルに保存する共通メソッド

C#
using System.IO;

public static void Base64ToFile(string base64, string outputPath)
{
if (string.IsNullOrWhiteSpace(base64)) return;
byte[] bytes = Convert.FromBase64String(base64);
File.WriteAllBytes(outputPath, bytes);
}

7-5. 入力チェックと例外処理を組み込む

共通メソッドには、nullチェックや例外処理を入れておくと実務で扱いやすくなります。
外部入力を想定するなら、検証を先に行い、必要なら try-catch で補う構成が安心です。

7-6. テストしやすい実装にするポイント

テストしやすくするには、I/O処理と変換処理を分けるのがコツです。
たとえば、文字列→Base64のロジックは純粋なメソッドにし、ファイル読み書きは別メソッドに分けると、単体テストが簡単になります。

8. C#のBase64変換で知っておきたい注意点

8-1. Base64は暗号化ではない

Base64は暗号化ではありません。
単にデータを別の形式で表現しているだけなので、Base64にしたからといって秘密にはなりません。

8-2. 変換後の文字列サイズは元データより大きくなる

Base64は、元データよりおおむね33%程度大きくなります。
そのため、通信量や保存容量に影響します。

8-3. 機密情報をBase64だけで保護してはいけない

パスワードやトークンなどの機密情報を、Base64だけで保護するのは危険です。
必要に応じて暗号化やハッシュ化を使い分けるべきです。

8-4. API・DB・ログに保存するときの注意点

Base64文字列をAPIやDB、ログに保存するときは、サイズと取り扱いに注意が必要です。
特にログ出力では、個人情報や秘密情報を含めないように設計することが重要です。

8-5. 用途に応じて暗号化や圧縮と使い分ける

Base64は「文字列化」に便利ですが、「保護」や「軽量化」には向きません。
機密性が必要なら暗号化、サイズ削減が必要なら圧縮を検討し、その上で必要に応じてBase64を使います。

9. C# Base64変換のよくある質問

9-1. C#でBase64エンコードするにはどのメソッドを使う?

Convert.ToBase64String() を使います。
文字列を扱う場合は、先に Encoding.UTF8.GetBytes()byte[] に変換します。

9-2. C#でBase64デコードするにはどのメソッドを使う?

Convert.FromBase64String() を使います。
文字列に戻す場合は、さらに Encoding.UTF8.GetString() を使います。

9-3. 日本語をBase64にすると文字化けするのはなぜ?

エンコード時とデコード時の文字コードが一致していないことが原因です。
UTF-8で統一すれば、文字化けを防ぎやすくなります。

9-4. Base64文字列を画像ファイルに戻すには?

Convert.FromBase64String()byte[] に戻し、File.WriteAllBytes() で保存します。
data:image/png;base64, のようなプレフィックスがある場合は事前に取り除きます。

9-5. Base64UrlとBase64は何が違う?

Base64UrlはURLで扱いやすいように +/ を置き換え、= を省略することがあります。
JWTやURLパラメータでよく使われます。

9-6. Convert.FromBase64Stringでエラーになるときは?

入力文字列がBase64として不正な可能性があります。
改行、空白、余計なプレフィックス、不正文字、パディング不足を確認してください。

まとめ

C#でBase64変換を行う基本は、文字列なら Encoding.UTF8.GetBytes()Convert.ToBase64String()、デコード時は Convert.FromBase64String()Encoding.UTF8.GetString() を組み合わせることです。ファイルの場合は File.ReadAllBytes()File.WriteAllBytes() を使えば、画像、PDF、ZIPなども簡単に扱えます。

ただし、Base64は暗号化ではなく、サイズも増えるため、用途に応じた使い分けが大切です。エラー対策やBase64Url、Data URIの処理まで押さえておくと、C#のBase64実装を実務で安定して使えるようになります。