回 1-5 道 1 数と論理と計算量
リトルエンディアンは、
読み終えたら同じ
この頁の流れ
値その
なぜ 同じ 値が、 逆の 順に並ぶのか
2 バイト以上の
たとえば
手が
エンディアンは どう 決まっているのか
エンディアンは、
ビッグエンディアンと リトルエンディアンの違い
ビッグエンディアンは
| 番地 | ビッグ | リトル |
|---|---|---|
| 0 | 12 | 78 |
| 1 | 34 | 56 |
| 2 | 56 | 34 |
| 3 | 78 | 12 |
ビッグエンディアンは、
入れ替えるのは
なぜ 2 つに 分かれ、 なぜ その 名前なのか
エンディアンの
2 つに
どの 機械と どの 通信がどちらか
今の
| 場所 | 並び |
|---|---|
| Intel x86、 | リトル |
| Apple M1 | リトル |
| Windows の | リトル |
| IBM z | ビッグ |
| WebAssembly のメモリ | リトル |
| IP や | ビッグ |
IP の
この
ファイルの 形式は、 形式ごとに 決めている
ファイルの
文字でも、
並びを 入れ替えて変換する
並びのint.to_bytes と int.from_bytes に
動かして確かめる
同じ値をto_bytes(4, "big") は"little" は
動かす 同じ値を 2 つの並びで
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
big 12 34 56 78
little 78 56 34 12
番地 0 12 78
番地 1 34 56
番地 2 56 34
番地 3 78 12番地 0 には、
次に、sys.byteorder はarray に
動かす 自分の機械の並びを見る
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
little
78 56 34 12
01 00
下の桁が番地 0この
並びは、struct は< はリトル、> はビッグ、! は
動かす 並びを決めて詰める
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
<I 78 56 34 12
>I 12 34 56 78
!I 12 34 56 78! と > はI は
最後に、
動かす 並びを入れ替える
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
0x78563412
0x123456782 回入れ替えると
並びを 取り違えると 何が起きるか
書いた
読み違えた 値は、 桁ごと 入れ替わる
ビッグで
動かす ビッグで書きリトルで読む
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
0x12345678 305419896
0x78563412 2018915346
00 00 00 01
16777216305419896 は
通信の
動かす 8080 を読み違える
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
1f 90
368958080 は
文字にも 並びの 取り 違えがある
UTF-16 の
動かす あ を UTF-16 で読み違える
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
30 42
42 30
e3 81 82
䈰 0x4230「あ」の
崩れる
- 書いた
機械と 読む機械の 並びが 同じ、という 前提。 ファイルや 通信で 別の 機械に 渡ると崩れる - 1 と
0 だけの 試験の 値で 並びの 誤りが 見つかる、という 前提。 0 は 並びを 逆に しても 0 なので 見つからない - 1 バイトの
データに 並びの 問題は 無い、という 前提は 正しい。 並びが 効くのは 2 バイト以上の値だけ
仕事で どう 確かめるか
仕事では、
1 つ目は、struct なら < か > か ! を@ や
2 つ目は、
3 つ目は、data[:16].hex(" ")、端末なら xxd や hexdump で
関わる実例
並びの
Apache の mod_access の 穴 CVE-2003-0993 (NVD の 公開 2004 年 3 月 29 日)
米国の
崩れた
よくある問い
リトルエンディアンの メリットは何ですか
リトルエンディアンでは
自分の パソコンが どちらかを 確かめるには どうしますか
Python なら import sys のあと sys.byteorder を
ネットワークバイトオーダーとは何ですか
ネットワークバイトオーダーは、
Java や C では どう 変換しますか
C 言語では、ByteBuffer の order(ByteOrder.LITTLE_ENDIAN) で
確認クイズ
答えだと
1 問目
0x12345678 を
2 問目
この
1 をリトルで読む
b = (1).to_bytes(2, "big")
n = int.from_bytes(b, "little")
print(n)3 問目
ネットワークバイトオーダーに
4 問目
並びの
説明課題
次の
- 0x12345678 が、
ある 機械では 12 34 56 78、 別の 機械では 78 56 34 12 と並ぶ理由 - 並びを
取り違えた とき 何が 起き、 どう防ぐか
自分の
この回の 先の一歩
バイナリの
もっと深く
この
一次資料
どれも
- struct Interpret bytes as packed binary data (Python 公式文書、英語)。
<がリトル、>がビッグ、!がネットワーク (ビッグ) の 並びであること、 Iが4 バイトの 符号なしの 整数である こと、 Intel x86、 AMD64、 Apple M1 が リトルで IBM z が ビッグであること - ARM64 ABI conventions overview (Microsoft Learn、英語)。Windows の
ARM64 が リトルエンディアンで動くこと - sys System-specific parameters and functions (Python 公式文書、英語)。
sys.byteorderが機械の 並びを big か little で返すこと - On Holy Wars and a Plea for Peace, IEN 137 (Danny Cohen、
1980年4月1日、英語)。Big-Endians と Little-Endians の 呼び名が ガリバー旅行記から来たこと - RFC 791 Internet Protocol (IETF、英語)。付録 B の
Data Transmission Order で、 数を 一番上の 桁から 送ると 定めていること - WebAssembly Core Specification (W3C、英語)。メモリの
読み 書きが リトルエンディアンであること - UTF-8, UTF-16, UTF-32 and BOM (Unicode の
FAQ、英語)。UTF-16 の BOM が FE FF と FF FE である こと、 UTF-8 に 並びの 問題が無いこと - PNG Specification Version 1.2 (libpng.org、英語)。2 バイト以上の
整数を ネットワークバイトオーダー (最上位の バイトが 先) で書くこと - CVE-2003-0993 (米国 NIST の
NVD、英語)。Apache 1.3.30 より 前の mod_access が、 ビッグエンディアンの 64 ビットの 機械で、 ネットマスクの 無い IP アドレスの 許可と 拒否の 決まりを 正しく 読めなかったこと
次へ
道 1 数と論理と計算量の回
- 1-12 進数と
16 進数桁の 重み、 変換、 表せる範囲頁で読む - 1-2文字コードと文字化けUnicode、
UTF-8、 Shift_JIS、BOM頁で読む - 1-3計算量を数えるBig-O、
ループの回数頁で読む - 1-4論理と真理値表AND、
OR、 NOT、 ド・モルガン準備中 - 1-5リトルエンディアンと
ビッグエンディアンバイトの 並び順、 ネットワーク、ファイルこの回 - 1-6Base64 の仕組み64 字の
表、 = の 詰め物、 長さ 4/3頁で読む - 1-7情報量と
ハフマン符号化ビット、 確からしさ、圧縮頁で読む - 1-8チューリングマシンと停止問題テープ、
状態、 計算できない問題頁で読む
