バイト配列をひっくり返す(intel配列とモトローラ配列)

ごくたまにだが、Mac系とIntel系でのメモリ上の格納方式の違いを意識しなければいけないことがある。例えばデジカメ画像に含まれるExifデータやVirtual PCのVirtual HDDファイルを読むときなどが挙げられる。
そのようなときに使うと便利なのがこのようなマクロ。
0x12345678という配列であれば0x78563412のようにひっくり返してくれる。もちろんDWORDだけでなく、int、shortやLONGLONGなどほかの型でも使える。

依存環境:ATL
#include "atlstr.h"


#define	SWAP_BYTE_ALIGNMENT(data)	\
{									\
	int		i;						\
	int		nSize;					\
	int		nLoop;					\
	BYTE*	pData;					\
	BYTE	cbTmp;					\
									\
	pData = (BYTE*)&data;			\
	nSize = sizeof(data);			\
	nLoop = nSize / 2;				\
	for(i = 0; i < nLoop; i++)		\
	{								\
		cbTmp = *(pData + i);		\
		*(pData + i) = *(pData + nSize - i - 1);	\
		*(pData + nSize - i - 1) = cbTmp;			\
	}								\
}



void	Test(void)
{
	CAtlString	strMessage;
	DWORD		dwData;

	dwData = 0x12345678;
	SWAP_BYTE_ALIGNMENT(dwData)

	strMessage.Format(_T("%08x"),dwData);

	::MessageBox(NULL,strMessage,_T(""),MB_OK);
}

プロジェクトファイルをダウンロード


カテゴリー「システム情報」 のエントリー