sumikko.tokyo

presents "用語とかんたん情報学"

ビットとバイト、符号化と各種表現

お知らせ: たぶん古い記事です。

🐦「こんにちは。記事メンテナンスサービスです。」

🐦「この記事は大雑把に 980 日以上は経過しているようです。内容の賞味期限にご注意ください。」

通信の流れに乗って、信号に関する情報工学に触れます。

0 か 1 の信号単位を 1 ビット "bit" と呼び、 8 ビットで 1 バイト "Byte" と呼ぶことが主流です。

Attention!

この章は長いし、本シリーズ上では重要でもないです。

ざっと読み流してもらって大丈夫です。

最後の「まとめ」だけでもオッケーです。

Rev3

16進数のとこの記載ミスを修正しました。1 バイトは 16 進数なら「2桁」。

1バイトの16進数表記は 0x00, 0x01,... から 0xff の範囲です。

"0x" は「続く文字が 16 進数」を意味する業界標準的なものです。

なので「2桁」に修正しました。あと変換ミス修正とか。

ビットとバイトの混在、オクテット、そしてややこしい背景

面倒なことに専門業界では 「ビット」と「バイト」の略は混在しています。

  • ビット "bit" は b と小文字が多いです。
  • バイト "byte" は B で大文字が多いです。
  • 歴史的には 1 バイトが 7 ビットだったり 9 ビットだったりもしました。

ネットワーク技術者はビット単位を用いることが多いです。

  • 8 ビットの塊を、バイトではなく「オクテット "octet"」と呼ぶことも主流です。
  • 8 を意味する「オクト "oct"」+「ビット "bit"」からなる造語ですね。
  • バイトより正確な意味合いになります。

ただ今や 1 バイト = 8 ビット(= 1 オクテット) が事実上標準化しています。

このシリーズでは「1バイト」

「1バイト」= 1 [Byte] = 1 [B] = 8 [b] = 8 [bit] =「8ビット」とします。

つまり「1バイト」=「1オクテット」と同義とします。

ギガなどの補助単位系に関しては後述します。

符号化 (エンコード、デコード)

1 バイトでは 0 か 1 が 8 個並ぶので、2 の 8 乗の数の「範囲」を表現できます。

0 と 1 の集まりをどう具体的な数値に当てはめるかを、大雑把に「符号化」と呼びます。

  • 0 と 1 の塊に、なんらかの信号を変換することを「エンコード」といいます。
  • 0 と 1 の塊から、なんらかの信号を得ることを「デコード」といいます。

暗号の世界

暗号化理論でも同様にエンコード・デコードという言葉を使います。 暗号にすることがエンコードで、暗号をもとに戻すのがデコードです。

暗号化はそれだけで数十冊の専門書ができます。 種類も違えば、暗号強度の違いなどもあり、実に多彩です。大雑把な点は後述します。

符号化の例

Note

この章はやや専門的なので、この先は読み飛ばしても頂いて構わないです。

1バイトの符号化の例を挙げます。

  • 0 から 255 までの 256 個の整数を当てはめれば、正の整数系です (UINT8)。
  • 半分程度ずらして負の数を範囲に入れてもいいです (INT8)。
  • 指数を使えばある範囲の小数を相応の精度で表現もできます(浮動小数点数)。

広義には文字も符号化対象です。

  • 例えばASCII表現では英数記号を基本に数字と文字を対応させます(16進数0x41 = "A")。
  • 更に広義にはバーコードやQRコードなども符号化です。読み取り訂正情報などが混ざります。

2進数、8進数、16進数

情報工学では2のn乗という数値がどうしても便利なのですが、 一般的な10進数表現では桁数がズレたりして不便になります。

なので8進数や、16文字使っての16進数表現 ( 0〜9 に a〜f を足す) を 多用します。

特に 1 バイト = 8 ビットなら、その表現は 16 進数がピッタリ 2 文字(桁)になります。

8 進数はどちらかというと、4 つの状態を組み合わせた表現を扱うのに使います。

ワード、リトルエンディアン/ビッグエンディアン

Note

この章は専門的なので読み飛ばしても頂いて構わないです。

さて 1 バイトだと 255 個の区別にしか使えません。

実際には範囲か精度が不足することが多くなります。

そこでバイトをさらに束ねた表現をします。「ワード "word"」ということが多いです。

  • 大雑把に2〜16バイト(16ビット〜128ビット)以上です。環境によります。
  • 大きな数のため、多くのバイトを一単位にするわけです。
  • どの順に並べるかで、ビッグエンディアン "BE" と リトルエンディアン "LE" という概念が生じます。

小数などを表現する方法も更に複数あり、 しかも AI 関連で増えてます。

浮動小数点数はFP32 (float) からFP64 (double) と拡大してきた歴史ですが、 AI関連では精度はそれほど不要という研究結果から FP16 などへ削減し、 代わりに同じ規模の回路を使って一度に計算できる量を増やしたりします。

ワードはどちらかというとCPU設計におけるデータのまとまりで使われます。

典型的にはメモリ空間の範囲を規定します。64ビットだと2の64乗で 使い切れないほどに感じる空間が表現できますが、ちょっと古い32ビットコンピューターでは 2の32乗 ≒ 4GBなので、今はむしろ「少ない」イメージになります。

文字の符号化(エンコード・デコード)の乱立とUnicode

この場合の「文字」は自然言語である日本語や英語とつながります。

自然言語と人工言語

自然言語はヒトが会話や記述に用いる言語を指します。

他方でプログラミング言語やHTMLなどは人工言語とも呼びます。

形式的(formal) = 「機械的にかんたんに処理できる」かどうかが大雑把な違いです。

自然言語は表現に例外が多く、人工言語では逸脱表現はエラーで終わりです。

2010年頃まで問題になっていたのは「各国語の表現のための符号化」の乱立でした。

  • 日本語でいうとISO、JIS、EUCといった方法がありました。今も一部では用いられています。
  • 英語以外の言語にはかなり多彩な文字や文字修飾があります(ウムラウトなど)。
  • 要するに全世界的に「文字」のコンピューター上の取扱が異なっていました。

そこで「Unicode (ユニコード)」という概念が提唱され、定義され、今や標準になりました。

  • Unicode 自体も複数の歴史があります。大雑把に「全範囲」は 32 ビット空間です。
  • ただ日本語でも「常用範囲」は 16 ビットで十分です(65,000くらいの範囲)。
    • つまり 32 ビットそのままだと「ほぼ使ってない部分」が大半になります。
    • これはデータの保存にしても転送にしてもかなりの無駄を意味します。
  • なので UTF という Unicode の範囲をどう表現するかという別の決まりがあります。
    • 例) UTF-8 では基本 1 バイト単位で、必要に応じて複数バイトを使います。
    • 例) UTF-16 では 2 バイト単位です。前述の「エンディアン」が絡みます。UTF-16LE など。

「符号化」は本来の広義の意味ではそういった「文字をどう数値表現するか」も含みます。

多国での多国語をどう特定するか

ここに更に「どの国」の「どの言語(公用語が複数の国もあります)」が加わります。

例えば "ja_JP.UTF-8" は「日本国 (JP)で用いる日本語 (ja)の UTF-8 による Unicode です。

「アメリカ (US)における英語 (en)の UTF-8 による Unicode」は "en_US.UTF-8" で、 「英国 (GB)の英語 (en)の UTF-8 によるUnicode」は "en_GB.UTF-8" という具合です。

こういった表記による国と言葉の区別を「ロケール "locale"」とも呼びます。

まとめ

  • 「符号化」は広義な言葉です。大雑把に信号をどう 0 と 1 に結びつけるかの決まりです。
  • 基本的な符号化は数値範囲や表現と 0 と 1 の対応です。
  • 文字を 0 と 1 でどう扱うかも符号化と呼ばれることが多いです。

それ以外の信号、音や画像などについては後述します。

Published: (Modified: )