unsigned char hoge[] = { 0x00, 0x00, 0x00, 0x01 };
なんて配列があった時にCHAR_TO_INT32(hoge)
のようにすると、unsigned intで1を返してくれるマクロを作ってみました。
// バイトスワップ関連 #define BS_BYTE1(x) ( (x) & 0xFF ) #define BS_BYTE2(x) ( ( (x)>> 8 )& 0xFF ) #define BS_BYTE3(x) ( ( (x)>>16 )& 0xFF ) #define BS_BYTE4(x) ( ( (x)>>24 )& 0xFF ) #define BYTESWAP_INT16(x) ( (unsigned short)( (BS_BYTE1(x)<<8) | BS_BYTE2(x) ) ) #define BYTESWAP_INT32(x) ( BS_BYTE1(x)<<24 | BS_BYTE2(x)<<16 | BS_BYTE3(x)<<8 | BS_BYTE4(x) ) #ifdef ビッグエンディアン用 #define INT16_TO_LE(x) ( BYTESWAP_INT16(x) ) #define INT32_TO_LE(x) ( BYTESWAP_INT32(x) ) #define INT16_TO_BE(x) (x) #define INT32_TO_BE(x) (x) #endif #ifdef リトルエンディアン用 #define INT16_TO_LE(x) (x) #define INT32_TO_LE(x) (x) #define INT16_TO_BE(x) ( BYTESWAP_INT16(x) ) #define INT32_TO_BE(x) ( BYTESWAP_INT32(x) ) #endif // 2/4バイトのchar配列型ビッグ/リトルエンディアン値をshort/int値に変換する #define BE_ARRAY_TO_INT16(x) (unsigned short)( INT16_TO_BE( *(unsigned short*)x ) ) #define BE_ARRAY_TO_INT32(x) (unsigned int)( INT32_TO_BE( *(unsigned int*)x ) #define LE_ARRAY_TO_INT16(x) (unsigned short)( INT16_TO_LE( *(unsigned short*)x ) ) #define LE_ARRAY_TO_INT32(x) (unsigned int)( INT32_TO_LE( *(unsigned int*)x ) )
ビッグエンディアン値用(BE_〜)とリトルエンディアン値用(LE_〜)があります。fread
などでchar配列に読み込んだ値を、整数値に変換するのに便利かなぁと。
処理の都合上、バイトスワップ用のマクロも入ってますが、気にしないで下さい。これらもどっかで使えると思います。
動作はMac OS X v10.4.10(gcc 4.0.1)でしか確認していません。VC++2005でも確認プログラムは作ったのですが「ランタイムがねーよ」と言われて実行できなかったので、そこでやる気を無くしました。