バイトシーケンスの大端バイトシーケンスと小端バイトシーケンスの理解

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つのデータを格納する方法があります.
たとえば、数値0x2211は、上位バイトが0x22であり、下位バイトが0x11である2バイトを使用して格納される.
  • 大端バイト順:上位バイトが前、下位バイトが後、これは人間が数値を読み書きする方法である.
  • 小端バイト順:下位バイトが前、上位バイトが後、すなわち0x1122として格納される.

  • 同様に、0x1234567の大端バイト順と小端バイト順の書き方を下図に示す.
    理解字节序 大端字节序和小端字节序_第1张图片
    2.
    私はずっと理解していません.どうしてバイト順があるのか、読むたびに区別しなければなりません.面倒ですね.エンドバイトシーケンスを統一的に使うほうが便利ではないでしょうか.
    先週、私は文章を読んで、すべての疑問に答えました.そして、元の理解が間違っていることに気づきました.バイト順は実は簡単です.
    3.
    まず、なぜ小さなエンドバイトシーケンスがあるのでしょうか.
    答えは、コンピュータ回路が低位バイトを先に処理し、計算が低位から始まるため、効率が高いということです.したがって、コンピュータの内部処理はすべて小端バイトシーケンスである.
    しかし、人間はやはり大端バイト順を読むことに慣れている.したがって,コンピュータの内部処理を除いて,ネットワーク転送やファイル格納などの大エンドバイトシーケンスがほとんどである.
    4.
    コンピュータがバイトシーケンスを処理するとき、上位バイトとは何か、下位バイトとは何か分かりません.バイトを順番に読み取り、最初のバイトを先に読み、2番目のバイトを読むことしか知られていません.
    大端バイト順であれば、先に読むのが高位バイトで、後に読むのが低位バイトです.小端バイト順は正反対です.
    この点を理解してこそ、コンピュータがバイトシーケンスをどのように処理するかを理解することができます.
    5.
    バイト順の処理は、一言です.
    「読み出しの場合のみ、バイト順を区別する必要があります.他の場合は考慮しないでください.」
    プロセッサが外部データを読み出すときは,データのバイト順を知り,正しい値に変換しなければならない.その後、この値を正常に使用し、バイトシーケンスを全く考慮する必要はありません.
    外部機器にデータを書き込む場合でも、バイト順を考慮せずに1つの値を正常に書き込めばよい.外部デバイスはバイトシーケンスの問題を自分で処理します.
    6. 
    バイト順変換の例
    異なるcpuプラットフォームのバイト順は通常異なり、以下に簡単なCプログラムを書いて、異なるプラットフォームのバイト順をテストすることができます.

    #include 

    #include 

    int main()

    {

        int i_num = 0x12345678;

        printf("[0]:0x%x", *((char *)&i_num + 0));

        printf("[1]:0x%x", *((char *)&i_num + 1));

        printf("[2]:0x%x", *((char *)&i_num + 2));

        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をネットワークバイト順に変換し、ネットワークバイト順が大端法であることがわかる.