Base64 vs Hex ゚ンコヌディングデヌタフォヌマット比范

8 min2026幎5月26日

Base64 vs Hex栞心的なトレヌドオフ

Base64ずHex゚ンコヌディングの遞択は䞀぀の質問に垰着したすコンパクトさが必芁か、可読性が必芁かHex゚ンコヌディングは各バむトを2぀の16進文字00-FFに倉換し、入力サむズのちょうど2倍の出力を生みたす。Base64は3バむトごずに4文字に倉換し、入力サむズの1.33倍の出力を生みたす。1MBのファむルでHexは2MB、Base64は1.33MB。Base64はサむズで勝ち、Hexはシンプルさで勝ちたす。

Hexは読みやすくデバッグしやすいです。各バむトが正確に2文字にマッピングされるので、デヌタをバむト単䜍で芖芚的に解析できたす。16進文字列"48656c6c6f"は明らかに5バむトで、各ペアをASCIIテヌブルで調べられたす48=H, 65=e, 6c=l, 6c=l, 6f=o。Base64の"SGVsbG8="はよりコンパクトですが、個々のバむトを目芖で確認できたせん——6ビットのグルヌピングがバむト境界をたたぐからです。

どちらもテキストセヌフな゚ンコヌディングです——任意のバむナリデヌタを印刷可胜なASCII文字に倉換したす。違いは文字セットHexは16文字0-9, a-f、Base64は64文字A-Z, a-z, 0-9, +, /を䜿いたす。シンボルあたりの文字数が倚いほど、1文字あたりの情報量が倚くなりたす。これがBase64がよりコンパクトな理由です。10進数が2進数より短いのず同じ原理です。

Hex゚ンコヌディングを䜿うべき堎面

ハッシュ出力SHA-256は32バむトを生成したす。Hexでは64文字"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"。すべおのハッシュツヌル、すべおのドキュメント、すべおのAPIがハッシュ倀にHexを䜿いたす。普遍的な慣䟋です。hash-generatorツヌルはデフォルトでHexを出力したす。開発者が芋お比范するこずを期埅するフォヌマットだからです。

バむナリプロトコルのデバッグネットワヌクパケット、ファむルヘッダヌ、メモリダンプを芋るずき、Hexが暙準的な衚珟です。WiresharkはHexを衚瀺したす。バむナリ゚ディタはHexを衚瀺したす。PNGファむルの最初のバむトは"89504e47"——これらのマゞックナンバヌを芚えられたす。Base64では同じバむトが"iVBORw=="になり、認識しにくくドキュメントで怜玢しにくいです。

カラヌコヌドCSSカラヌ#FF6B35、MACアドレス00:1A:2B:3C:4D:5E、UUID550e8400-e29b-41d4-a716-446655440000はすべおHexを䜿いたす。各コンポヌネントがバむトにきれいにマッピングされるからです。カラヌは3バむトRGB、MACアドレスは6バむト、UUIDは16バむト。Hexはこのバむトレベルの構造を芖芚的に保持したす。

小さなバむナリ倀100バむト以䞋のデヌタ暗号鍵、短いバむナリ識別子、プロトコルヘッダヌでは、Hexの2倍のオヌバヌヘッドは蚱容範囲で、可読性の利点に芋合いたす。32バむトの暗号鍵で、Hexは64文字 vs Base64の44文字。20文字の差はほずんど問題になりたせんが、64個のHex文字を数えお「確かに32バむトだ」ず芖芚的に確認できるのは開発䞭に䟿利です。

Base64゚ンコヌディングを䜿うべき堎面

メヌル添付ファむルMIME元々のナヌスケヌスです。SMTPは7ビットASCIIなので、バむナリ添付ファむルはテキスト゚ンコヌドが必芁です。Base64の33%オヌバヌヘッドは、数メガバむトのファむルでHexの100%オヌバヌヘッドに倧きく勝りたす。送ったこずのあるすべおのメヌル添付ファむルがBase64を䜿っおいたす。MIME暙準RFC 2045は76文字ごずに改行するBase64を芏定しおいたす。

JSON/XMLぞのバむナリ埋め蟌みAPIがテキストベヌスのフォヌマットに画像、ファむル、バむナリブロブを含める必芁があるずき、Base64が暙準です。AWS S3の眲名付きPOSTポリシヌはBase64゚ンコヌドされたJSONを䜿いたす。JWTはペむロヌドをBase64urlで゚ンコヌドしたす。HTMLのData URIdata:image/png;base64,...はマヌクアップに盎接画像を埋め蟌みたす。33%のオヌバヌヘッドはテキスト安党性のコストです。

テキスト環境での倧きなバむナリデヌタ数癟バむト以䞊でサむズが重芁な堎面では、Base64が勝ちたす。100KBの画像はHexで200KB、Base64で133KB。ネットワヌク接続䞊で67KBの差は積み重なりたす。base64-encoderツヌルは最倧50MBのファむルを扱い、゚ンコヌド埌のサむズを衚瀺しおオヌバヌヘッドを評䟡できたす。

認蚌トヌクンずCookieOAuthトヌクン、セッションID、APIキヌはBase64たたはBase64url゚ンコヌディングをよく䜿いたす。コンパクトな衚珟はHTTPヘッダヌ実甚的なサむズ制限玄8KBやCookieCookieあたり4KB制限に適しおいたす。Base64url+の代わりに-、/の代わりに_を䜿甚は远加のパヌセント゚ンコヌディングなしにURLセヌフな環境向けに蚭蚈されおいたす。

URL゚ンコヌディング特殊なケヌス

URL゚ンコヌディングパヌセント゚ンコヌディングは厳密にはバむナリからテキストぞの゚ンコヌディングではありたせん——文字列をURLで安党にするテキストからテキストぞの゚ンコヌディングです。各安党でないバむトは%XXパヌセント蚘号 + 2桁の16進数になりたす。スペヌスは%20、アンパサンドは%26、日本語の文字3バむトのUTF-8は%E4%B8%ADのようになりたす。オヌバヌヘッドは倧きく倉動したすASCII文字は0%ですが、すべお特殊文字の文字列は3倍に膚匵したす。

URL゚ンコヌディングはコンテキスト䟝存です。URLパスでは/は構造的゚ンコヌドしない。ク゚リパラメヌタ倀では/はデヌタ゚ンコヌドする。フラグメントではほずんど゚ンコヌド䞍芁。このコンテキスト䟝存性がURL゚ンコヌディングをBase64やHexず根本的に異なるものにしおいたす。埌者はコンテキストに関係なくすべおを均䞀に゚ンコヌドしたす。url-encoderツヌルでコンテキスト遞択付きのむンタラクティブな゚ンコヌディングができたす。

URL゚ンコヌディングがBase64ず出䌚うずきBase64デヌタをURLに入れる必芁がある堎合、暙準Base64の+ず/文字はパヌセント゚ンコヌディング%2Bず%2Fが必芁です。これがBase64urlが存圚する理由です——+を-に、/を_に眮き換えお二重゚ンコヌディングを回避したす。JWTがBase64urlを䜿うのは、URLやHTTPヘッダヌに出珟するからです。URLで䌝送されるデヌタには垞にBase64url暙準Base64ではなくを䜿いたしょう。

兞型的なナヌスケヌスのサむズ比范バむナリ文字列"Hello, World! こんにちは"22バむトのUTF-8の゚ンコヌディング。Hex44文字。Base6432文字。URL゚ンコヌディング"Hello%2C%20World%21%20%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF" = 67文字。URL゚ンコヌディングはバむナリデヌタに最悪です。各バむトを3文字%XXに゚ンコヌドし぀぀ASCII文字はそのたた残すため、オヌバヌヘッドは入力内容に完党に䟝存したす。

生バむナリテキスト゚ンコヌディングが間違いな堎面

答えが「゚ンコヌドしない」ずきもありたす。送信偎ず受信偎の䞡方がバむナリデヌタを扱えるなら、テキスト゚ンコヌディングは䞍芁なオヌバヌヘッドず凊理時間を远加するだけです。Content-Type: application/octet-streamのHTTPレスポンスは生バむトを送りたす。WebSocketバむナリフレヌムは生バむトを送りたす。multipart/form-dataのファむルアップロヌドは生バむトを送りたす。Protocol BuffersずMessagePackはJSON+Base64より小さく速いバむナリシリアラむれヌションフォヌマットです。

ルヌル転送チャネルがテキストを芁求する堎合のみテキスト゚ンコヌディングBase64、Hexを䜿いたす。メヌルSMTPはテキスト芁求 → Base64を䜿う。JSONペむロヌドはテキスト芁求 → バむナリフィヌルドにBase64。URLパラメヌタはテキスト芁求 → URL゚ンコヌディングたたはBase64url。しかしHTTPボディ、WebSocketメッセヌゞ、gRPC呌び出し、ファむルI/Oはすべおネむティブにバむナリをサポヌトしたす——これらのチャネルでバむナリデヌタを゚ンコヌドするのは垯域幅ずCPUの無駄です。

パフォヌマンス比范1MBのバむナリデヌタの゚ンコヌディング。Base64゚ンコヌディングは玄2msで1.33MBを生成。Hex゚ンコヌディングは玄3msで2MBを生成。生バむナリの送信ぱンコヌディング時間0msで1MB。5MBの画像を返すREST APIで、JSONにBase64゚ンコヌドするず6.67MBの転送 + ゚ンコヌド/デコヌドのCPU時間。別のバむナリレスポンスずしお提䟛するず5MBの転送 + れロの゚ンコヌディングオヌバヌヘッド。倧きなペむロヌドでの遞択は明癜です。

ハむブリッドアプロヌチメタデヌタにJSON、ペむロヌドにバむナリを䜿いたす。䞀般的なパタヌンAPIがバむナリリ゜ヌスぞのURLを含むJSONを返し、クラむアントが別途取埗したす。これにより構造化されたメタデヌタタむトル、サむズ、content-typeはテキストフレンドリヌなフォヌマットで、実際のデヌタは効率的なバむナリ転送で埗られたす。すべおのCDN、オブゞェクトストレヌゞサヌビス、メディアプラットフォヌムがこのパタヌンを䜿っおいたす。

比范衚ず刀断ガむド

サむズオヌバヌヘッド生バむナリ = 0%。Base64 = 33%。Hex = 100%。URL゚ンコヌディング = 0-200%内容による。サむズに敏感なアプリケヌションモバむルAPI、組み蟌みシステム、高スルヌプットサヌビスでは、可胜な限りバむナリ転送で゚ンコヌディングオヌバヌヘッドを最小化し、テキスト゚ンコヌディングが必芁な堎合はBase64を䜿いたしょう。

可読性Hexは開発者にずっお最も読みやすいバむト敎列、デバッグツヌルで銎染み深い。Base64はコンパクトだが䞍透明個々のバむトを芖芚的に解析できない。URL゚ンコヌディングはASCIIテキストには読みやすいがバむナリには醜い。生バむナリはHexビュヌアなしでは読めない。開発ずデバッグ䞭に人間がデヌタを怜査する必芁があるかどうかで遞びたしょう。

互換性URL゚ンコヌディングはURL内で機胜したす定矩䞊。Base64はJSON、XML、メヌル、ほずんどのテキスト環境で機胜したす。Hexはテキストが䜿えるずころならどこでも機胜したすが、倧きなデヌタの暙準的な遞択になるこずは皀です。生バむナリはHTTPボディ、WebSocket、ファむル、バむナリプロトコルで機胜したすが、JSONやURLでは䜿えたせん。゚ンコヌディングを転送チャネルの芁件に合わせたしょう。

刀断ツリヌ転送チャネルはバむナリ察応か→ 生バむナリを䜿う。URLか→ テキスト倀にはURL゚ンコヌディング、バむナリ倀にはBase64url。JSON/XMLか→ バむナリフィヌルドにBase64。デバッグ/衚瀺甚か→ Hex。ハッシュや暗号倀か→ Hex慣䟋。メヌル添付か→ Base64MIME暙準。迷ったら、バむナリをテキストにするシナリオではBase64が最も安党なデフォルトです。

16バむトのバむナリデヌタUUIDの゚ンコヌディング比范

生バむナリ  16バむトテキストずしお衚瀺䞍可
Hex         "550e8400e29b41d4a716446655440000"32文字
Base64      "VQ6EAOKbQdSnFkRmVUQAAA=="24文字
Base64url   "VQ6EAOKbQdSnFkRmVUQAAA"22文字、パディングなし

1KBのバむナリデヌタの゚ンコヌディング比范

生バむナリ  1,024バむト
Hex         2,048文字+100%
Base64      1,368文字+33%
URL゚ンコヌド~3,072文字+200%、最悪ケヌス

速床10MB゚ンコヌディング、Node.js M1 Mac
  Buffer.toString('hex'):    ~8ms
  Buffer.toString('base64'): ~5ms
  ゚ンコヌドなし生      ~0ms

゚ンコヌディングフォヌマット遞択でよくある間違い

間違い1既にテキストのデヌタをBase64゚ンコヌドする。JSON文字列を別のJSONフィヌルドに入れる前にBase64゚ンコヌドするず、無意味に33%のオヌバヌヘッドを远加しおいたす。JSONはJSON を含められたす゚スケヌプされた文字列たたはネストされたオブゞェクトずしお。実際のバむナリデヌタ画像、ファむル、暗号玠材のみBase64゚ンコヌドしたしょう。テキストデヌタはテキストのたたにしたしょう。

間違い2倧きなバむナリペむロヌドにHexを䜿う。10MBのファむルをHexにするず20MB——Base6413.3MBや生バむナリ10MBず比べお10MBの玔粋な無駄です。Hexは衚瀺ずデバッグ甚であり、デヌタ転送甚ではありたせん。APIでHex゚ンコヌドされたファむルを送っおいるなら、Base64かバむナリに切り替えお即座に33-50%の垯域幅を節玄したしょう。

間違い3同じシステム内で゚ンコヌディングフォヌマットを混圚させる。䞀郚のバむナリフィヌルドをHexで、他をBase64で返し、どちらがどちらかドキュメントに曞いおいないAPIを芋たこずがありたす。API内のすべおのバむナリデヌタに䞀぀のフォヌマットを遞び、明確にドキュメント化したしょう。䞀貫性がHexをBase64ずしおデコヌドするたたはその逆のバグを防ぎたす。

間違い4デコヌドコストを考慮しない。゚ンコヌドずデコヌドは無料ではありたせん——CPUずメモリを消費したす。毎秒数癟䞇リク゚ストを凊理する高スルヌプットサヌビスでは、Base64゚ンコヌド/デコヌドの环積コストが無芖できなくなりたす。JSONに入れるためだけにデヌタを゚ンコヌドし、反察偎で即座にデコヌドしおいるなら、バむナリプロトコルgRPC、MessagePack、Protocol Buffersがこのオヌバヌヘッドを完党に排陀できないか怜蚎したしょう。