Skip to content

16進数 文字列 変換ツール(文字列→16進数にも対応)

16進数を文字列に、文字列を16進数に変換。スペース区切り・0x・\x、xxd や hexdump の出力、Java や C のバイト配列もそのまま貼るだけで、ASCII・UTF-8・GBK・UTF-16 を自動判別します。処理はすべてブラウザ内で完結。

トラッキングなし ブラウザで動作 無料
変換はすべてブラウザ内で行われます。貼り付けた内容がこの端末の外に出ることはありません。
例を試す

素の16進数 として読み取り · 13 バイト

    テキスト
    Hello, 世界

    UTF-8 と自動判別:すべてのマルチバイトシーケンスが正しい形です。

    同じバイト列を各エンコードで読んだ結果

    エンコード 読み取り結果
    UTF-8 問題なくデコード Hello, 世界
    GBK / GB18030 問題なくデコード Hello, 涓栫晫
    UTF-16LE デコードできないバイトあり 效汬Ɐ隸闧�
    UTF-16BE デコードできないバイトあり 䡥汬漬⃤뢖�
    ISO-8859-1 問題なくデコード Hello, ä¸<96>ç<95><8C>
    ここに掲載した16進ダンプ、バイト配列、エラーメッセージは、xxd、Python 3.14、Node.js 26、Go 1.27、clang を実際に実行して取得したものです。エンジンの各出力形式は、元のバイト列に読み戻せることをテストで確認しています。Java と PHP の挙動は公式ドキュメントから引用しています。 — Go Tools エンジニアリングチーム · Sep 16, 2026

    Go Tools のエンコード系ツールを開発するエンジニアが執筆・レビューしています。本ページに掲載した16進数の値と出力は、すべてページ自身のエンジンで生成し、自動テストで検証しています。

    16進数→ASCII 変換の早わかり

    48 65 6C 6C 6F をテキストにすると?

    Hello ASCII と UTF-8 では 48 が H、65 が e、6C が l、6F が o です。

    中国語の漢字 1 文字は何バイト?

    UTF-8 では通常 3 バイト、GBK では 2 バイト 你 は UTF-8 では E4 BD A0、GBK では C4 E3 です。

    0D 0A とは?

    CR LF(\r\n) キャリッジリターンとラインフィードの組み合わせで、Windows、HTTP、大半のシリアルコマンド体系で使われる改行です。

    英字の A は16進数でいくつ?

    41 小文字の a は 61 で、大文字と小文字の差は常に 20 です。

    16進数→文字列変換とは?

    16進数(hex)はバイトを書き表す方法のひとつで、0〜255 の各バイトを 00 から FF までの 2 桁で表します。16進数から文字列への変換は、そのバイト列を読めるテキストに戻す処理で、必ず文字エンコード(文字コード)の選択を伴います。文字エンコードとは、どのバイト、あるいはどのバイト列がどの文字を表すかを定めた対応表のことです。

    英語のテキストでは、この選択が表に出ることはめったにありません。ASCII、UTF-8、GBK をはじめ大半のエンコードが 00 から 7F までのバイトの意味で一致しているからです。それ以外の文字では、すぐに差が出ます。バイト C4 E3 BA C3 は GBK では 你好 ですが UTF-8 としては不正で、UTF-8 の 你好 は E4 BD A0 E5 A5 BD です。16進数は情報の半分にすぎず、残りの半分がエンコードです。

    文字列から16進数への変換はその逆で、テキストをバイト列にエンコードしてから、各バイトを16進数 2 桁で書き表します。開発者はこれを使って、シリアル回線やデータベースのカラムに実際に何が入っているかを確かめたり、バイナリデータをソースコードに埋め込んだり、2 つのシステムが実際に送ったものを比較したりします。

    $ echo 48656c6c6f | xxd -r -p
    Hello
    
    >>> bytes.fromhex('c4e3bac3').decode('gbk')
    '你好'
    >>> bytes.fromhex('c4e3bac3').decode('utf-8')
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte

    この16進数変換ツールでできること

    どんな形式の16進数も貼り付けOK

    スペース区切り、区切りなし、コロンやハイフン区切り、0x 値、\x エスケープ、% エンコード、C・Go・Java の配列、Java の符号付き Arrays.toString 出力、Python の bytes リテラル、Node.js の Buffer、さらに xxd・hexdump -C・od の画面出力まで。何を認識し、何を取り除いたかをページが表示します。

    エンコードを自動判別し、理由も表示

    自動判別はバイトオーダーマーク、正しい形の UTF-8、UTF-16、純粋な ASCII、最後に GBK の順にチェックし、どのルールで決まったかを示します。GBK を選ぶのはバイト列がよく使われる中国語の文字として読める場合だけなので、短いバイナリフレームは意味不明な中国語ではなく「おそらくテキストではない」と報告されます。

    すべてのエンコードを並べて比較

    同じバイト列を UTF-8、GBK、UTF-16LE、UTF-16BE、ISO-8859-1 で表示し、それぞれ問題なくデコードできたかどうかを示します。テキストが文字化けしたときは、たいてい 1 行下に正しい読み方があります。

    見えないバイトを可視化

    NUL、CR、LF、ESC などの制御バイトを ␀ ␍ ␊ ␛ で表示するので、プロトコルデータの末尾に余分な 00 があったり 0D が欠けていたりすればすぐにわかります。コピーすると実際の文字が得られます。

    コードにそのまま貼れる出力

    「テキスト → 16進数」では、スペース区切りまたは区切りなしの16進数、0x のリスト、\x エスケープ、xxd -i 形式の C 配列、符号付きの値を使った Java の byte[]repr() と同じ形の Python bytes リテラル、Go の []byte、xxd 形式のダンプを出力できます。これらはすべて本ページで読み戻せます。

    データはブラウザの外に出ない

    解析もデコードも、ローカルの JavaScript で実行されます。アップロード、保存、URL への付加は一切ないので、パケットキャプチャや本番ログも安心して貼り付けられます。

    プログラムで16進数を文字列に変換する

    Python 3

    bytes.fromhex(h).decode()

    bytes.fromhex('48 65 6c 6c 6f').decode('utf-8')'Hello' を返します。バイト間のスペースは使えますが、0x プレフィックスは使えません。逆方向は s.encode('utf-8').hex() で、スペース区切りなら .hex(' ') です。GBK の中国語テキストをデコード・エンコードするには 'gbk' を渡します。

    JavaScript(Node.js)

    Buffer.from(h, 'hex')

    Buffer.from(h, 'hex').toString('utf8') でデコード、Buffer.from(s, 'utf8').toString('hex') でエンコードします。不正な入力でもエラーになりません。デコードは最初の不正なペアで止まり、末尾の余った 1 桁は捨てられるので、先に検証してください。

    JavaScript(ブラウザ)

    TextDecoder / TextEncoder

    parseInt(pair, 16) でペアを解析して Uint8Array に入れ、new TextDecoder('utf-8').decode(bytes) でデコードします。TextDecoder'gbk''big5''shift_jis' も読めますが、TextEncoder が出力できるのは UTF-8 だけです。

    Java 17+

    HexFormat.of()

    new String(HexFormat.of().parseHex(h), StandardCharsets.UTF_8) でデコード、HexFormat.of().formatHex(s.getBytes(StandardCharsets.UTF_8)) でエンコードします。古いバージョンでは各バイトを String.format("%02x", b) で書式化します。負のバイトを ffffffe4 と出力してしまう Integer.toHexString(b) は避けてください。

    Go

    encoding/hex

    hex.DecodeString(h) でバイト列を得て string(b) で文字列にし、hex.EncodeToString([]byte(s)) で元に戻します。チェックは厳格で、スペースがあると invalid byte: U+0020 ' '、長さが奇数だと odd length hex string が返ります。

    C

    sscanf with %2hhx

    文字列を 2 桁ずつループで unsigned char のバッファに読み込み、終端の '\0' を追加します。16進数で出力するときは unsigned char にキャストして %02X を使います。そうしないと、char が符号付きの環境では 0x7F を超えるバイトが FFFFFFE4 と出力されることがあります。

    PHP

    hex2bin() / bin2hex()

    hex2bin('48656c6c6f')Hello を、bin2hex('Hello')48656c6c6f を返します。マニュアルには、長さが奇数または不正な入力に対して hex2bin()E_WARNING とともに false を返すと記載されています。

    シェル(xxd)

    xxd -r -p / xxd -p

    echo 48656c6c6f | xxd -r -p は Hello を出力し、printf 'Hello' | xxd -p48656c6c6f を出力します。エンコードするときは echo ではなく printf を使ってください。echo は末尾に改行 0a を追加するからです。

    C#(.NET 5+)

    Convert.FromHexString()

    Encoding.UTF8.GetString(Convert.FromHexString(h)) でデコードし、Convert.ToHexString(Encoding.UTF8.GetBytes(s)) でエンコードします(大文字、区切り文字なし)。FromHexString はスペースや 0x プレフィックスを受け付けません。.NET Core と .NET 5 以降には GBK が含まれていないため、先に Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) を呼び出してから Encoding.GetEncoding(936) を使ってください。

    16進数→文字列変換の実例

    中国語を含む UTF-8 の16進数

    48 65 6C 6C 6F 2C 20 E4 B8 96 E7 95 8C
    Hello, 世界

    最初の 7 バイトは普通の ASCII です。48 65 6C 6C 6F が Hello、2C がカンマ、20 がスペースです。E4 B8 96E7 95 8C は 世 と 界 を表す 3 バイトの UTF-8 シーケンスで、中国語の文字の多くは UTF-8 で 3 バイトを使います。すべてのシーケンスが正しい形なので、自動判別は UTF-8 として読みます。

    UTF-8 としては不正な、GBK のセンサー値

    CE C2 B6 C8 3A 32 35 2E 33 A1 E6
    温度:25.3℃

    シリアル機器の多くは中国語のテキストを GBK で送ります。ここでは CE C2 が 温、B6 C8 が 度、3A 32 35 2E 33 が ASCII の :25.3A1 E6 が全角の ℃ 記号で、中国語の文字や記号は 1 文字 2 バイトです。UTF-8 として読むとこのバイト列は不正で(CE は 2 バイトシーケンスの先頭ですが、C2 は継続バイトではありません)、GBK として読むとよく使われる文字になるので、自動判別は GBK を選びます。UTF-8 しか扱えない変換ツールでは、ここに置換文字が並ぶだけです。

    xxd の出力をそのまま貼り付け

    00000000: 4869 20e4 bda0 e5a5 bd0d 0a              Hi ........
    Hi 你好␍␊

    これは printf 'Hi 你好\r\n' | xxd の出力そのものです。デコードの前に、オフセット 00000000: と右側の文字列カラムを取り除きます。これらをデータとして読むと、8 個のゼロだけで先頭に NUL バイトが 4 つ増えてしまいます。最後の 2 バイト 0d 0a は Windows の改行で、␍␊ と表示されます。

    ログに出力された Java のバイト配列

    [-28, -72, -83, -26, -106, -121]
    中文

    Arrays.toString(bytes) は Java の符号付きバイトを 10 進数で出力します。負の値は 0x80 以上のバイトで、-28 は 256 − 28 = 228 = 0xE4 です。6 バイトの E4 B8 AD E6 96 87 は 中文 の UTF-8 エンコードです。

    シリアル通信の AT コマンドをテキストから16進数に

    AT+CSQ\r\n
    41 54 2B 43 53 51 0D 0A

    モデムや大半の UART コマンド体系は、各コマンドの末尾にキャリッジリターンとラインフィードを求めます。テキスト入力欄で Enter を押しても 0A しか入らないので、改行を CR LF にするにチェックを入れると行末が 0D 0A になります。

    二重に16進数エンコードされたデータ

    653462646130653561356264
    e4bda0e5a5bd → 你好

    ここでは全バイトが ASCII の16進数字です(65 は e、34 は 4、62 は b)。そのため 1 回目のデコード結果もまた16進数の文字列になります。16進数の文字列をテキストとして扱い、もう一度変換すると起こる現象です。本ページは 2 回目のデコードを提案し、你好 が得られます。誤検知を避けるため、1 回目の結果が 12 桁以上の16進数で、かつ 2 回目が実際のテキストにデコードできる場合にだけ提案します。日付、タイムスタンプ、CRC32 値、MD5 ハッシュでは発動しません。

    16進数を文字列に変換する方法

    1. 1

      16進数を貼り付ける

      「16進数 → テキスト」タブの入力欄に、手元にある形式のまま貼り付けます。スペース区切り、区切りなし、0x 値、\x エスケープ、バイト配列、xxd の画面出力まるごとでも構いません。入力欄の下に、どの形式として読み取ったかが表示されます。

    2. 2

      テキストとエンコードを確認する

      右側にテキストが表示され、自動判別したエンコードとその理由も示されます。推測が外れていたら、下の表ですべての読み方を確認し、「エンコード」メニューで正しいものを選んでください。

    3. 3

      不可視文字をチェックする

      NUL、CR、LF などの制御バイトは ␀ ␍ ␊ で表示されます。「不可視文字を表示」のチェックを外して素のテキストにしてから、結果をコピーします。

    4. 4

      テキストから16進数への変換も

      「テキスト → 16進数」タブでエンコードと出力形式を選びます。スペース区切りの16進数、0x 値、C・Java・Python・Go の配列、xxd 形式のダンプから選べます。シリアル通信やネットワークプロトコル向けなら CR LF にチェックを入れます。

    16進数→文字列変換で失敗する原因

    GBK のバイトを UTF-8 でデコードする

    古い Windows ソフトウェア、多くのシリアル機器、レガシーなデータベースの中国語テキストは GBK です。UTF-8 でデコードすると失敗するか、出力が置換文字だらけになります。エンコード表を見て、意味の通る読み方を使ってください。

    ✗ 誤り
    >>> bytes.fromhex('c4e3bac3').decode('utf-8')
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte
    ✓ 正しい
    >>> bytes.fromhex('c4e3bac3').decode('gbk')
    '你好'

    JavaScript で charCodeAt() を使ってバイトを得る

    charCodeAt() が返すのは UTF-16 のコードユニットです。ASCII ではたまたまバイトと一致するため、バグはそれ以外の文字で初めて表面化し、その値は UTF-8 のシステムが実際に送るものとは異なります。

    ✗ 誤り
    '你'.charCodeAt(0).toString(16)   // '4f60' — a UTF-16 code unit
    ✓ 正しい
    Buffer.from('你', 'utf8').toString('hex')   // 'e4bda0' — the UTF-8 bytes

    Java で符号付きバイトを Integer.toHexString で書式化する

    Java の byte は符号付きなので、0x80 以上のバイトは負の値になります。Integer.toHexString() は int を対象とし、負の値を 32 ビットの符号なし16進数で出力するうえ、先頭のゼロも省きます。

    ✗ 誤り
    Integer.toHexString(b)        // "ffffffe4" for 0xE4, "a" for 0x0A
    ✓ 正しい
    String.format("%02x", b)      // "e4", "0a"

    未検証の16進数を Node.js の Buffer.from() に任せる

    Buffer.from(hex, 'hex') は決して例外を投げません。16進数として不正な最初のペアで止まり、末尾の余った 1 桁を無視するので、タイプミスがあってもエラーにならず、短いバッファが返されるだけです。

    ✗ 誤り
    Buffer.from('486', 'hex')      // <Buffer 48> — the 6 is silently dropped
    Buffer.from('48zz65', 'hex')   // <Buffer 48> — stops at zz
    ✓ 正しい
    if (!/^([0-9a-f]{2})*$/i.test(hex)) throw new Error('invalid hex');
    Buffer.from(hex, 'hex');

    オフセット列付きの16進ダンプを貼り付ける

    スペースを取り除くだけの変換ツールは、オフセット 00000000: をデータとして読み、文字列カラムも読める部分は16進数として読んでしまいます。結果は NUL バイトで始まり、そこから次々にずれていきます。素の16進数が欲しいなら xxd -p を使うか、列を認識できる本ページにダンプを貼り付けてください。

    ✗ 誤り
    00000000: 4869 20e4 bda0 e5a5 bd0d 0a              Hi ........
    → read naively: 00 00 00 00 48 69 20 e4 …
    ✓ 正しい
    $ printf 'Hi 你好\r\n' | xxd -p
    486920e4bda0e5a5bd0d0a

    CR LF が必要な機器に LF だけを送る

    AT モデムや多くの行ベースのプロトコルは、各コマンドの末尾にキャリッジリターンとラインフィードを求めます。0A だけで終わるコマンドは、エラーも出ないまま無視されることがよくあります。

    ✗ 誤り
    41 54 2B 43 53 51 0A      AT+CSQ followed by LF only
    ✓ 正しい
    41 54 2B 43 53 51 0D 0A   AT+CSQ followed by CR LF

    16進数→文字列変換が必要になる場面

    シリアル通信・UART のデバッグ
    シリアルターミナルは受信データを16進数で表示します。フレームを貼り付ければ中のテキストが読め、末尾の 0D 0A00 も見つけられます。逆方向に使えば、機器が受け付ける CR LF 改行付きのコマンドを組み立てられます。
    パケットキャプチャの解読
    Wireshark や tcpdump からコピーしたプロトコルのペイロードは16進数です。フレーム内のリクエスト行、JSON ボディ、デバイス名をデコードするなら、スクリプトを書くよりここに貼り付けるほうが早く、データも手元から出ません。
    アプリケーションログのバイト配列
    Java はバイト配列を符号付き 10 進数で、Python は b'...' リテラルで、Node.js は <Buffer ...> の形でログに出力します。ログの断片をそのまま貼り付ければ、UTF-8 か GBK かも含めてテキストを確認できます。
    データベースの16進数カラムと BLOB
    データベースツールはバイナリのカラムを16進数で表示します。値をデコードして実際に何が保存されているかを確かめたり、テキストを16進数に変換してデータベースの中身と 1 バイトずつ比較したりできます。
    ファームウェアや C ソースの文字列
    組み込みコードではテキストをバイト配列で持ちます。文字列をそのまま貼れる C 配列に変換したり、ヘッダファイルの配列をテキストに戻して、機器が何を表示するかを確認したりできます。

    16進数とテキストの対応関係:ASCII・UTF-8・GBK・UTF-16

    1 バイトは16進数 2 桁
    1 バイトは 8 ビット、16進数 1 桁は 4 ビットなので、1 バイトは必ず 00 から FF までの 2 桁になり、バイト数は常に桁数の半分です。大文字と小文字の意味は同じです。区切り文字、プレフィックス、配列の構文は表記にすぎません。486548 650x48, 0x65\x48\x65 はどれも同じ 2 バイトです。
    ASCII:どのエンコードでも共通のバイト
    ASCII は 00 から 7F までを割り当てています。表示可能な文字は 20(スペース)から 7E(~)までで、残りは制御文字です。実際のデータでよく見かけるのは 00(NUL)、09(タブ)、0A(ラインフィード)、0D(キャリッジリターン)、1B(エスケープ)です。UTF-8、GBK、ISO-8859-1 はいずれもこれらの値をそのまま保っているため、英語だけのテキストはエンコードを間違えてもほとんど崩れません。
    UTF-8:1 文字 1〜4 バイト
    UTF-8 は ASCII を 1 バイトで、それ以外の文字をバイトのシーケンスで表します。先頭バイトが長さを示し、C2DF なら 2 バイト、E0EF なら 3 バイト、F0F4 なら 4 バイトで、後続のバイトはすべて 80BF の範囲に収まらなければなりません。この厳格な構造のおかげで、GBK の中国語の文が UTF-8 として正しい形になることはまずありません(中国語の文 33,910 件で試したところ、該当したのは 55 件でした)。自動判別が問題なく UTF-8 としてデコードできた結果を信頼するのはこのためです。ただし 1 文字だけの場合は事情が違い、GBK の文字の約 18% はたまたま正しい 2 バイトの UTF-8 シーケンスになります。
    GBK:中国語の文字は 2 バイト
    GBK は ASCII を 1 バイトのまま残し、中国語の文字と全角記号を 2 バイトで表します。先頭バイトは 81 から FE、後続バイトは 7F を除く 40 から FE です。後続バイトの範囲がとても広いため、短い UTF-8 のテキストを GBK として読むと、エラーもなく無関係な文字にデコードされることがよくあります。E4 BD A0 E5 A5 BD(你好)は 浣犲ソ になります。本ページが UTF-8 を先に試すのはこのためです。GB18030 は珍しい文字用の 4 バイトシーケンスを加えて GBK を拡張したもので、本ページのデコードはこれにも対応しています。
    UTF-16 とバイト順
    UTF-16 は 1 文字 2 バイト(基本多言語面の外の文字は 4 バイト)で、その 2 バイトの並び順は 2 通りあります。UTF-16LE は下位バイトが先で A は 41 00、UTF-16BE は上位バイトが先で 00 41 です。Windows の API や多くのファイルはリトルエンディアンを使い、先頭にバイトオーダーマーク FF FE が付くことがあります。UTF-8 のファイルも EF BB BF で始まることがあります。自動判別はバイトオーダーマークを取り除き、その旨を表示します。

    16進数と文字列を確実に相互変換するコツ

    送る側と受け取る側の両方でエンコードを明示する
    16進数だけでは、どのエンコードで作られたかはわかりません。テキストをバイト列に変換するすべての場所(getBytes()encode()、シリアルターミナルの設定、データベース接続の文字セット)でエンコードを明示的に指定し、16進数の横に書き添えておけば、受け取る側が推測する必要はありません。
    文字コード値ではなくバイトを扱う
    JavaScript の charCodeAt() や Java の char 値のように文字コードを返す関数は、エンコード後のバイトではなく UTF-16 のコードユニットを返します。まず TextEncoderBuffer.from()getBytes(StandardCharsets.UTF_8) で文字列をエンコードしてから、バイトを書式化してください。
    各バイトは必ず 2 桁にそろえる
    %02x などを使い、数値を16進数にするだけの呼び出しは避けます。a0a はログの中では似て見えますが、ゼロ埋めしていない値を連結すると長さが奇数の文字列になるか、さらに悪い場合は別のバイト列としてデコードされる文字列になります。
    1 つのログでは区切りの形式を統一する
    ログやトレースでは、スペース区切りの 2 桁ずつなど 1 つの形式を決めて守ります。形式が混在していると、人には読みやすくてもスクリプトは読み違えやすくなります。ゼロ埋めされた値とされていない値が混じっている場合は特にそうです。
    バイト数を確認する
    変換結果を信用する前に、バイト数を期待値と比べます。プロトコルヘッダの長さフィールド、カラムのサイズ、ファイルサイズなどです。本ページはどちらの方向でもバイト数を表示します。

    16進数→文字列変換のよくある質問

    16進数を文字列に変換するにはどうすればよいですか?
    「16進数 → テキスト」タブの入力欄に16進数を貼り付ければ、すぐにテキストが表示されます。手作業なら 2 段階です。まず16進数を 2 桁ずつに区切ります。16進数 2 桁が 1 バイトで範囲は 00 から FF なので、48656c6c6f は 48、65、6C、6C、6F の 5 バイトです。次に、そのバイト列を文字エンコードに従ってデコードします。ASCII と UTF-8 では 48 が H、65 が e、6C が l、6F が o で、Hello になります。結果に違いが出るのは 2 段階目です。7F を超えるバイトは UTF-8、GBK などのエンコードごとに別の文字を表すため、本ページはエンコードを判別し、すべての読み方を並べて表示します。
    16進数を変換すると文字化けするのはなぜですか?
    ほとんどの場合、誤ったエンコードでバイト列をデコードしているのが原因です。典型例は中国語のテキストです。C4 E3 BA C3 は GBK では 你好 ですが UTF-8 としては不正で、E4 BD A0 E5 A5 BD は UTF-8 では 你好 なのに GBK として読むと 浣犲ソ になります。結果の下にあるエンコード表を見てください。意味の通るテキストになっている行が、データが書かれたときのエンコードです。1〜2 文字しかない場合は、自動判別でも見分けられないことがあります。D2 BB は UTF-8 としても正しく(һ)、GBK としても正しい(一)ので、結果の下に表示される GBK の読み方を確認してください。ほかに疑うべき原因が 2 つあります。16進数の桁が 1 つ多いか少ないせいで以降のバイトがすべて半バイトずれている場合と、16進ダンプをオフセット列ごと貼り付けている場合です。16進数ではなく、すでに文字化けしたテキスト(浣犲ソ など)が手元にある場合は、そのテキストをエンコード変換・文字化け修復ツールに貼り付けてください。
    シリアル通信のデータがテキストでは文字化けするのに、16進数では正しく見えるのはなぜですか?
    16進数が正しいなら、ボーレート、データビット、パリティの設定は合っています。これらを間違えると、バイトそのものが変わってしまうからです。問題はバイトを文字に変換する段階にあり、原因はたいてい次の 3 つのどれかです。まず、データがそもそもテキストではない場合です。Modbus RTU のようなバイナリプロトコルは、16進数で見なければ意味をなしません。次に、エンコードが合っていない場合です。機器は中国語を UTF-8 で送っているのにシリアルターミナルが GBK で表示している(またはその逆の)ときは、你好 の UTF-8 バイト列 E4 BD A0 E5 A5 BD が 浣犲ソ と表示されます。最後に、テキストに 000D 0A などの制御バイトが含まれていて、四角い記号や改行として表示される場合です。16進数をここに貼り付ければ、エンコード表に UTF-8 と GBK の読み方が並んで表示され、制御バイトは ␀ ␍ ␊ として表示されます。
    HEX を ASCII に変換するのと UTF-8 に変換するのとでは何が違いますか?
    ASCII が定義しているのは 00 から 7F までのバイトだけで、英字、数字、記号、制御文字が含まれます。UTF-8 はこれらのバイトがまったく同じ文字を表すように設計されており、それ以外の文字はすべて 80 以上のバイトを組み合わせたシーケンスで表します。アクセント付きのラテン文字は 2 バイト、中国語・日本語・韓国語の文字の大半は 3 バイト、絵文字は 4 バイトです。そのため英語だけのテキストなら、HEX から ASCII への変換と UTF-8 への変換は同じ結果になります。違いが出るのは 80 以上のバイトが現れたときです。ASCII 専用の変換ツールはそうしたバイトを文字として表示できませんが、UTF-8 なら Unicode の全範囲の文字にデコードできます。00 から 7F までの各バイトが何を表すかは、ASCII コード表で確認できます。
    中国語の漢字 1 文字は16進数で何バイトになりますか?
    エンコードによって異なります。UTF-8 では中国語の漢字の大半が 3 バイトで、你 は E4 BD A0 です。GBK と GB2312 では 2 バイトで、你 は C4 E3 です。UTF-16 では基本多言語面(BMP)の文字が 2 バイトで、バイト順が重要になります。你 は UTF-16LE では 60 4F、UTF-16BE では 4F 60 です。BMP の外にある珍しい文字は、UTF-8 で 4 バイト、UTF-16 で 4 バイト(サロゲートペア)、GB18030 で 4 バイトです。「テキスト → 16進数」タブでエンコードを切り替えると、自分のテキストのバイト数を確認できます。
    Python で16進数を文字列に変換するには?
    bytes.fromhex() でバイト列にしてからデコードします。bytes.fromhex('48656c6c6f').decode('utf-8')'Hello' を返します。fromhex はバイト間のスペースを受け付けるので bytes.fromhex('48 65 6c 6c 6f') も動きますが、0x プレフィックスがあると ValueError になります。GBK のデータは 'gbk' でデコードします。bytes.fromhex('c4e3bac3').decode('gbk')'你好' を返し、同じバイト列を UTF-8 でデコードすると UnicodeDecodeError が発生します。逆方向は '你好'.encode('utf-8').hex() で、'e4bda0e5a5bd' が返ります。.hex(' ') のように区切り文字を渡すと、スペース区切りで出力されます。
    JavaScript で16進数を文字列に変換するには?
    Node.js では Buffer.from('48656c6c6f', 'hex').toString('utf8')'Hello' を返します。不正な入力には注意してください。Node は例外を投げず、最初の不正なペアで処理を止め、末尾の余った 1 桁は黙って捨てます。そのため Buffer.from('486', 'hex') は 1 バイトのバッファになります。ブラウザではバイト列を自分で組み立てて TextDecoder を使います。これは GBK も読めます。new TextDecoder('gbk').decode(Uint8Array.from('c4e3bac3'.match(/../g), h => parseInt(h, 16)))'你好' を返します。バイトを得る目的で charCodeAt() を使ってはいけません。'你'.charCodeAt(0).toString(16)'4f60' で、これは UTF-16 のコードユニットであり、UTF-8 のバイト e4bda0 ではありません。
    C 言語や C++ で16進数の文字列を文字列に変換するには?
    16進数を 2 桁ずつ unsigned char のバッファに読み込み、最後に終端文字を置きます。for (size_t i = 0; i < n; i++) sscanf(hex + 2 * i, "%2hhx", &buf[i]); buf[n] = '\0'; で、nstrlen(hex) / 2 です。hex48656c6c6f2c20e4b896e7958c にして UTF-8 のターミナルで buf を出力すると、Hello, 世界 と表示されます。逆方向は各バイトを printf("%02X ", (unsigned char)s[i]) で出力します。このキャストが重要で、char が符号付きのプラットフォームでは、0xE4 のようなバイトが符号拡張されて FFFFFFE4 と出力されてしまいます。C++ では、s.push_back(static_cast<char>(std::stoi(hex.substr(i, 2), nullptr, 16))) で 2 桁ずつ追加していけば、同じ hex から Hello, 世界 が得られます。
    Java で16進数を文字列に変換する方法と、ffffffe4 と表示される理由は?
    Java 17 以降なら new String(HexFormat.of().parseHex(hex), StandardCharsets.UTF_8) の 1 行で済みます。GBK のデータなら代わりに Charset.forName("GBK") を使います。逆方向(バイトを16進数にする場合)では、ffffffe4 と表示されて戸惑うのが定番です。そうなるのは、Java の byte は符号付きで、Integer.toHexString()int を受け取るからです。バイト 0xE4 は -28 として格納され、int に拡張しても値は -28 のままです。toHexString は負の数を符号なし 32 ビット値として出力するので、ffffffe4 になります。このメソッドは先頭のゼロも省くため、0x0Aa になります。負のバイトを符号なし 8 ビット値として書式化する String.format("%02x", b) を使うか、Integer.toHexString(b & 0xff) にゼロ埋めを組み合わせてください。Java 17 以降なら HexFormat.of().formatHex(bytes) で配列全体を変換でき、HexFormat.of().parseHex(hex) で元に戻せます。
    PHP で16進数を文字列に変換する関数は?
    hex2bin() は16進数の文字列をバイナリ文字列にデコードし、bin2hex() はその逆を行います。bin2hex('Hello')48656c6c6f を返します。PHP マニュアルによると、入力の長さが奇数だったり16進数として不正だったりすると hex2bin()false を返して E_WARNING を発生させるので、呼び出す前にスペースや 0x プレフィックスを取り除いてください。PHP の文字列はバイト列なので、結果は元のテキストのエンコードのままです。ページが UTF-8 なら、GBK の出力は mb_convert_encoding() で変換してください。
    xxd や hexdump の出力をそのまま貼り付けられますか?
    はい。オフセット列と文字列カラムを認識して取り除き、入力欄の下にその旨を表示します。スペースを取り除くだけの変換ツールはオフセットをデータとして読んでしまうので、これは重要な点です。本ページは xxd-u-c-g を含む)、hexdump -C、Go の hex.Dumpod -A x -t x1、GNU の od -t x1z に対応し、hexdump や od が繰り返し行の代わりに出力する * 行も展開します。バイトではなく 16 ビットのワードを出力するオプションなしの hexdumpod -x も扱えます。リトルエンディアンのマシンではバイト 48 696948 と出力されるため、本ページは各ペアを入れ替えて元の順序に戻し、最後のオフセットを使って奇数長のデータに付け足されたパディングバイトを取り除きます。xxd、hexdump、od の各形式は、ランダムなデータを実際にダンプした 600 件でテストしています。
    16進数の桁数が奇数なのはどういう意味ですか?
    何かが欠けたか、余分に入っています。1 バイトは必ず16進数 2 桁だからです。よくある原因は、数値を16進数にする関数が先頭のゼロを落とした(0a ではなく a)、コピー時に 1 文字切れた、0 の代わりに O のような文字が紛れ込んだ、などです。Python の hex(int.from_bytes(data, 'big')) のように全バイトを 1 つの大きな数として変換した16進数文字列は、先頭のゼロが失われます。\r\n0xd0a になります。本ページはどの桁が欠けたかを推測しません。推測を誤るとそれ以降のバイトがすべて半バイトずれ、もっともらしいのに無意味な結果になるからです。代わりに「先頭に 0 を追加」と「最後の桁を削除」の 2 つのワンクリック修正を用意しているので、結果を見比べられます。0x0 0xa のように値を 1 つずつプレフィックス付きで書いた場合は問題ありません。それぞれが 1 バイトとして読まれます。
    貼り付けたデータはどこかにアップロードされますか?
    いいえ。変換はブラウザ上の JavaScript で実行され、サーバーへの送信、保存、ページ URL への付加は一切行いません。ブラウザの開発者ツールの「ネットワーク」パネルで確認できます。変換ツールに貼り付ける16進数はパケットキャプチャ、ファームウェアのダンプ、本番環境のログの 1 行であることが多いため、この点は重要です。

    ASCIIコード表・アスキー変換ツール

    エンコーディングとフォーマット

    ASCII 128文字の完全なコード表。10進・16進・8進・2進を並べ、文字⇔ASCIIコードの双方向変換もその場でできます。制御文字には各言語のエスケープ、キャレット表記、そして実際にどこで出会うかを併記。すべてブラウザ内で動作し、入力は送信されません。

    Base64エンコーダー&デコーダー

    エンコーディングとフォーマット

    Base64のデコード・エンコードが無料でオンラインで行えます。リアルタイム変換、UTF-8・絵文字対応。100%ブラウザ上で動作しデータは外部に送信されません。登録不要。

    Base64 画像変換ツール

    エンコーディングとフォーマット

    Base64 文字列やデータURIをブラウザ上で画像に戻します。プレビューし、寸法と MIME を確認して、PNG・JPG・GIF・SVG としてダウンロード。アップロード不要。

    CSV to JSON 変換ツール

    エンコーディングとフォーマット

    CSVをブラウザ内で即座にJSONに変換。RFC 4180・型推論・ヘッダー行・大整数安全対応。100%プライベート、アップロード不要。

    エンコード変換・文字化け修復ツール

    エンコーディングとフォーマット

    文字化けしたテキストを貼り付けるだけで元の文字列を復元します。UTF-8、GBK、Big5、Shift_JIS、EUC-KR、Windows-1252 の組み合わせを総当たりで試し、往復検証を通ったチェーンを上位に並べて表示。各エンコードでのバイト対照と hex からの逆変換も可能です。無料・ブラウザ内処理で、貼り付けた内容は送信されません。

    .env から JSON への変換ツール

    エンコーディングとフォーマット

    .env ファイルを貼り付けるだけで即座に JSON に変換。データベースのパスワードや API キー、トークンはブラウザから一切出ません。100% プライベート、アップロード不要、無料の dotenv パーサー。