頭が混乱したので整理のため、
バイナリデータ、16進数、そして Node.js の Buffer.from()
がどのように動作しているのかまとめた。。。。
1. バイナリデータとは?
コンピュータは、全てのデータを 0と1(ビット)の列 で表現します。
この ビット列 を扱いやすい単位にまとめたものが バイナリデータ です。
- 1ビット: 0 または 1 のいずれかの値
- 1バイト: 8ビットで構成され、0〜255(計256通り)の値を表現可能
ポイント:
バイナリデータは、コンピュータが直接扱う「0と1」の情報そのものであり、あらゆるファイル(テキスト、画像、音声など)の基本形です。
2. 16進数とバイトの関係
2.1. 16進数の基本
- 16進数は、0~9 と A~F(または a~f)を使って表されます。
- 1桁の16進数は、4ビット(半バイト/ニブル)を表し、
例:C
(またはc
)は 12(10進数)→ 2進数では1100
(4ビット) - 2桁の16進数は、8ビット(1バイト)を表します。
例:C9
は、C
と9
を合わせて、10進数では 201 に相当し、
2進数では11001001
(8ビット) となります。
2.2. なぜ16進数を使うのか?
16進数は、バイナリデータ(0と1の列)をより短くコンパクトに表現する方法です。
- 1バイトのデータは 10進数では最大 3桁(0〜255)ですが、
- 16進数なら 2桁(00〜FF) で表現できるため、読みやすく、扱いやすくなります。
3. Buffer.from() の仕組み
Node.js の Buffer
は、バイナリデータの入れ物です。
Buffer.from()
は、与えた文字列を特定のエンコーディングで解釈し、内部にバイナリデータとして格納します。
3.1. Buffer.from(..., 'hex')
の動作
const idmWithoutHyphen = 'c9a6ec5299a540efa3ac5f38c4db6fdd';
const buf = Buffer.from(idmWithoutHyphen, 'hex');
console.log(buf); // <Buffer c9 a6 ec 52 99 a5 40 ef a3 ac 5f 38 c4 db 6f dd>
console.log(buf.toString('hex')); // "c9a6ec5299a540efa3ac5f38c4db6fdd"
このコードでは、以下の変換が行われます:
-
16進数の文字列として解釈
idmWithoutHyphen
は、元々ハイフンが除かれた16進数の文字列です。 - 2文字ずつ分割し、1バイトずつ変換
- 例:
c9
→ 16進数C9
は 10進数の 201、2進数では11001001
(1バイト)a6
→ 10進数の 166、2進数では10100110
(1バイト)
- このように、32桁の16進数は 16バイトのバイナリデータに変換されます。
- 例:
- Buffer に格納
- 変換された各バイトが連なって Buffer 内に保存されます。