从二进制文件中反向读取WORD?

时间:2011-01-16 00:44:12

标签: c++ binary jpeg

我有一个结构:

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而不是0x0010xdensityydensity也是如此。为什么我在阅读WORD时会收到错误的数据?

1 个答案:

答案 0 :(得分:7)

你在x86 cpu上存储低字节高字节(little endian)字样 二进制文件可能存储在big endian中。

您需要手动交换文件中的每个字节(或者您的JFIF库可能会为您执行此操作)

PS。交换字节最安全的方法是在'C'库中使用ntohs()和htons()宏。      有关字节顺序的详细信息,请参阅wiki文章