バイナリデータ、16進数、そして Buffer.from() の仕組み

頭が混乱したので整理のため、 バイナリデータ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 は、C9 を合わせて、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"

このコードでは、以下の変換が行われます:

  1. 16進数の文字列として解釈
    idmWithoutHyphen は、元々ハイフンが除かれた16進数の文字列です。

  2. 2文字ずつ分割し、1バイトずつ変換
    • 例:
      • c9 → 16進数 C9 は 10進数の 201、2進数では 11001001 (1バイト)
      • a6 → 10進数の 166、2進数では 10100110 (1バイト)
    • このように、32桁の16進数は 16バイトのバイナリデータに変換されます。
  3. Buffer に格納
    • 変換された各バイトが連なって Buffer 内に保存されます。

関連記事