バイトシーケンスの大端バイトシーケンスと小端バイトシーケンスの理解
2922 ワード
以下を参考に
http://www.ruanyifeng.com/blog/2016/11/byte-order.html
https://blog.csdn.net/yishengzhiai005/article/details/39672529
https://www.cnblogs.com/gremount/p/8830707.html
1.
コンピュータハードウェアには、大端バイト順(big endian)と小端バイト順(little endian)の2つのデータを格納する方法があります.
たとえば、数値大端バイト順:上位バイトが前、下位バイトが後、これは人間が数値を読み書きする方法である. 小端バイト順:下位バイトが前、上位バイトが後、すなわち
同様に、
2.
私はずっと理解していません.どうしてバイト順があるのか、読むたびに区別しなければなりません.面倒ですね.エンドバイトシーケンスを統一的に使うほうが便利ではないでしょうか.
先週、私は文章を読んで、すべての疑問に答えました.そして、元の理解が間違っていることに気づきました.バイト順は実は簡単です.
3.
まず、なぜ小さなエンドバイトシーケンスがあるのでしょうか.
答えは、コンピュータ回路が低位バイトを先に処理し、計算が低位から始まるため、効率が高いということです.したがって、コンピュータの内部処理はすべて小端バイトシーケンスである.
しかし、人間はやはり大端バイト順を読むことに慣れている.したがって,コンピュータの内部処理を除いて,ネットワーク転送やファイル格納などの大エンドバイトシーケンスがほとんどである.
4.
コンピュータがバイトシーケンスを処理するとき、上位バイトとは何か、下位バイトとは何か分かりません.バイトを順番に読み取り、最初のバイトを先に読み、2番目のバイトを読むことしか知られていません.
大端バイト順であれば、先に読むのが高位バイトで、後に読むのが低位バイトです.小端バイト順は正反対です.
この点を理解してこそ、コンピュータがバイトシーケンスをどのように処理するかを理解することができます.
5.
バイト順の処理は、一言です.
「読み出しの場合のみ、バイト順を区別する必要があります.他の場合は考慮しないでください.」
プロセッサが外部データを読み出すときは,データのバイト順を知り,正しい値に変換しなければならない.その後、この値を正常に使用し、バイトシーケンスを全く考慮する必要はありません.
外部機器にデータを書き込む場合でも、バイト順を考慮せずに1つの値を正常に書き込めばよい.外部デバイスはバイトシーケンスの問題を自分で処理します.
6.
バイト順変換の例
異なるcpuプラットフォームのバイト順は通常異なり、以下に簡単なCプログラムを書いて、異なるプラットフォームのバイト順をテストすることができます.
1
#include
2
#include
3
int main()
4
{
5
int i_num = 0x12345678;
6
printf("[0]:0x%x", *((char *)&i_num + 0));
7
printf("[1]:0x%x", *((char *)&i_num + 1));
8
printf("[2]:0x%x", *((char *)&i_num + 2));
9
printf("[3]:0x%x", *((char *)&i_num + 3));
10
11
i_num = htonl(i_num);
12
printf("[0]:0x%x", *((char *)&i_num + 0));
13
printf("[1]:0x%x", *((char *)&i_num + 1));
14
printf("[2]:0x%x", *((char *)&i_num + 2));
15
printf("[3]:0x%x", *((char *)&i_num + 3));
16
17
return 0;
18
}
80 X 86 CPUプラットフォームにおいて、このプログラムを実行すると、以下の結果が得られる.
[0]:0x78 [1]:0x56 [2]:0x34 [3]:0x12
[0]:0x12 [1]:0x34 [2]:0x56 [3]:0x78
解析の結果、80 X 86プラットフォームでは、システムは多バイトの下位ビットを変数の開始アドレスに格納し、小端法を使用する.htonlはi_numをネットワークバイト順に変換し、ネットワークバイト順が大端法であることがわかる.
http://www.ruanyifeng.com/blog/2016/11/byte-order.html
https://blog.csdn.net/yishengzhiai005/article/details/39672529
https://www.cnblogs.com/gremount/p/8830707.html
1.
コンピュータハードウェアには、大端バイト順(big endian)と小端バイト順(little endian)の2つのデータを格納する方法があります.
たとえば、数値
0x2211
は、上位バイトが0x22
であり、下位バイトが0x11
である2バイトを使用して格納される.0x1122
として格納される.同様に、
0x1234567
の大端バイト順と小端バイト順の書き方を下図に示す.2.
私はずっと理解していません.どうしてバイト順があるのか、読むたびに区別しなければなりません.面倒ですね.エンドバイトシーケンスを統一的に使うほうが便利ではないでしょうか.
先週、私は文章を読んで、すべての疑問に答えました.そして、元の理解が間違っていることに気づきました.バイト順は実は簡単です.
3.
まず、なぜ小さなエンドバイトシーケンスがあるのでしょうか.
答えは、コンピュータ回路が低位バイトを先に処理し、計算が低位から始まるため、効率が高いということです.したがって、コンピュータの内部処理はすべて小端バイトシーケンスである.
しかし、人間はやはり大端バイト順を読むことに慣れている.したがって,コンピュータの内部処理を除いて,ネットワーク転送やファイル格納などの大エンドバイトシーケンスがほとんどである.
4.
コンピュータがバイトシーケンスを処理するとき、上位バイトとは何か、下位バイトとは何か分かりません.バイトを順番に読み取り、最初のバイトを先に読み、2番目のバイトを読むことしか知られていません.
大端バイト順であれば、先に読むのが高位バイトで、後に読むのが低位バイトです.小端バイト順は正反対です.
この点を理解してこそ、コンピュータがバイトシーケンスをどのように処理するかを理解することができます.
5.
バイト順の処理は、一言です.
「読み出しの場合のみ、バイト順を区別する必要があります.他の場合は考慮しないでください.」
プロセッサが外部データを読み出すときは,データのバイト順を知り,正しい値に変換しなければならない.その後、この値を正常に使用し、バイトシーケンスを全く考慮する必要はありません.
外部機器にデータを書き込む場合でも、バイト順を考慮せずに1つの値を正常に書き込めばよい.外部デバイスはバイトシーケンスの問題を自分で処理します.
6.
バイト順変換の例
異なるcpuプラットフォームのバイト順は通常異なり、以下に簡単なCプログラムを書いて、異なるプラットフォームのバイト順をテストすることができます.
1
#include
2
#include
3
int main()
4
{
5
int i_num = 0x12345678;
6
printf("[0]:0x%x", *((char *)&i_num + 0));
7
printf("[1]:0x%x", *((char *)&i_num + 1));
8
printf("[2]:0x%x", *((char *)&i_num + 2));
9
printf("[3]:0x%x", *((char *)&i_num + 3));
10
11
i_num = htonl(i_num);
12
printf("[0]:0x%x", *((char *)&i_num + 0));
13
printf("[1]:0x%x", *((char *)&i_num + 1));
14
printf("[2]:0x%x", *((char *)&i_num + 2));
15
printf("[3]:0x%x", *((char *)&i_num + 3));
16
17
return 0;
18
}
80 X 86 CPUプラットフォームにおいて、このプログラムを実行すると、以下の結果が得られる.
[0]:0x78 [1]:0x56 [2]:0x34 [3]:0x12
[0]:0x12 [1]:0x34 [2]:0x56 [3]:0x78
解析の結果、80 X 86プラットフォームでは、システムは多バイトの下位ビットを変数の開始アドレスに格納し、小端法を使用する.htonlはi_numをネットワークバイト順に変換し、ネットワークバイト順が大端法であることがわかる.