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