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でも確認プログラムは作ったのですが「ランタイムがねーよ」と言われて実行できなかったので、そこでやる気を無くしました。