====== char型配列に格納されてる値を整数型値に変換するマクロ ====== ''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でも確認プログラムは作ったのですが「ランタイムがねーよ」と言われて実行できなかったので、そこでやる気を無くしました。