トップページ
ひらく | たたむ | ページトップ
↓マウスで反転選択した文字を検索
C
   
ページ内検索 ページ外検索
検索したい文字を入力して
ENTERを押すと移動します。
\n
[ トップページ ]
[ ____CommandPrompt ] [ ____JScript ] [ ____MySQL ] [ ____Cygwin ] [ ____Java ] [ ____Emacs ] [ ____Make ] [ ____Perl ] [ ____Python ] [ ____OpenGL ] [ ____C# ] [ ____StyleSheet ] [ ____C++ ] [ ____Winsock ] [ ____Thread ] [ ____VisualStudio ] [ ____C ] [ ____Win32API ] [ ____Lua ] [ ____PhotoShop ]
ヘッダ検索
___

■ Endian(エンディアン)


    数値の桁がどういう順番で並んでいるか
    ByteData [0x0000000]を上位からか、下位からかどちらかの方法でメモリに格納する順番
    MultiByte にならないと問題にならない

    1バイトより大きいサイズのオブジェクトの表現方法は環境によって異なる。

    LittleEndian :
      ちっちゃい順
    int i = 0xAABBCCDD;
    
    // メモリ上では 下の桁から格納される
    [DD][CC][BB][AA]
ネットワーク経由で送られたデータはビッグエンディアン

    // メモリレイアウト
    [11][22][33][44]

    // BigEndian としてみると
    0x11223344

    // LittleEndian としてみると
    0x44332211

BigEndian : 大きい桁順 ( PowerPC, ネットワークバイトオーダー ) LittleEndian : 小さい桁順 ( インテル系PC )
    Big endian( 人間にとってわかりやすい )
       

    上位バイトからそのまま 
    [11][AB][22][CD]
ファイルに格納する byte 列も当然影響をうける PC 環境では BE はありえない Endian が異なる環境では、バイトの並びを並び替える。
    uint32_t tmp = 0;

    tmp |=   0x000000ff & (ret >> 24);
    tmp |= ((0x000000ff & (ret >> 16)) < <  8);
    tmp |= ((0x000000ff & (ret >>  8)) < <  16);
    tmp |= ((0x000000ff & (ret >>  0)) < <  24);  // 下位 を 上位へ

    ret = tmp;
    
    uint16_t tmp;
    tmp |=   0x00ff & (ret >> 8);
    tmp |= ((0x00ff) & (ret >> 0)) < <  8;

環境によらず Endian をそろえるには int 型のオブジェクトがきたら必ず 下位の桁から順番にストリームへ出力する。
    char str[4];

    str[0] = ( i & 0x000000ff );
    str[1] = ( i & 0x0000ff00 ) >> 8;
    str[2] = ( i & 0x00ff0000 ) >> 16;
    str[3] = ( i & 0xff000000 ) >> 24;

    ofstream out;
    out.write( str, 4 );
POINT endian の相違は単一のシステム( 閉じた世界 )で運用する場合は問題なし。 WARNING 異なるシステムでネットワークを通して、[ バイト単位 ]のやりとりをする場合 2. 異なるシステム間でバイナリファイルを交換する場合。 3. 異なるシステムにプログラムを移植する場合。 4. 構成するプロセッサが異なるマルチプロセッサ環境で共有メモリを使用する場合。
    {
      unsigned long x = 0x11223344UL;

      unsigned char *p = (unsigned char)&x;

      // Memory 内の表現を見る
      for( i=0; i< sizeof(long); i++ ){
        printf( "%x", *p++ );
      }

    }

    // これと同じ
    fwrite( &x, sizeof(x), 1, stdout );


___

■ NetworkByteOrder

TCP/IP network ではendian の差分を統一するため、 多バイトからなるパケットをBig endian で統一。 画像、音声ファイルのバイナリファイルも互換性を保つため、endian を規定。 Unicode は構成単位が2byte。バイトオーダーマーク( BOM )というもので エンディアン方式を判別する仕組み。
















NINJAIDX 16