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

Jou*_*usi 0 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
};
Run Code Online (Sandbox Code Playgroud)

这是我从文件中读取它的方式:

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));
Run Code Online (Sandbox Code Playgroud)

这是我的文件的开头在十六进制编辑器中的样子:

0xFF 0xD8 0xFF 0xE0 0x00 0x10 0x4A 0x46 0x49 0x46 0x00 0x01 0x01 0x00 0x00 0x01
Run Code Online (Sandbox Code Playgroud)

当我打印header.marker时,它会准确显示它应该是什么(0xFFD8FFE0).但是当我打印时header.length,它显示0x1000而不是0x0010.同样的事情是xdensityydensity.为什么我在阅读时会收到错误的数据WORD

Mar*_*ett 7

你在一个x86 cpu上存储低字节高字节(小端)字.二进制文件可能存储在big endian中.

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

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