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から元の文字列に戻す手順
デコードは次の順番で行います。
Base64文字列を
Convert.FromBase64String()でbyte[]に戻す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実装を実務で安定して使えるようになります。

