我有一个结构:
struct JFIF_HEADER
{
WORD marker[2]; // = 0xFFD8FFE0
WORD length; // = 0x0010
BYTE signature[5]; // = "JFIF\0"
BYTE versionhi; // = 1
BYTE versionlo; // = 1
BYTE xyunits; // = 0
WORD xdensity; // = 1
WORD ydensity; // = 1
BYTE thumbnwidth; // = 0
BYTE thumbnheight; // = 0
};
这是我从文件中读取它的方式:
HANDLE file = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
DWORD tmp = 0;
DWORD size = GetFileSize(file, &tmp);
BYTE *DATA = new BYTE[size];
ReadFile(file, DATA, size, &tmp, 0);
JFIF_HEADER header;
memcpy(&header, DATA, sizeof(JFIF_HEADER));
这是我的文件的开头在十六进制编辑器中的显示方式:
0xFF 0xD8 0xFF 0xE0 0x00 0x10 0x4A 0x46 0x49 0x46 0x00 0x01 0x01 0x00 0x00 0x01
当我打印header.marker时,它会准确显示它应该是什么(0xFFD8FFE0
)。但是,当我打印header.length
时,它会显示0x1000
而不是0x0010
。 xdensity
和ydensity
也是如此。为什么我在阅读WORD
时会收到错误的数据?
答案 0 :(得分:7)
你在x86 cpu上存储低字节高字节(little endian)字样 二进制文件可能存储在big endian中。
您需要手动交换文件中的每个字节(或者您的JFIF库可能会为您执行此操作)
PS。交换字节最安全的方法是在'C'库中使用ntohs()和htons()宏。 有关字节顺序的详细信息,请参阅wiki文章