C++ memcpy从数组尾部复制了错误的数据

C++ memcpy从数组尾部复制了错误的数据,c++,memcpy,C++,Memcpy,我对memcpy函数有问题。我尝试从字符数组复制部分数据,但没有成功 // Types typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long DWORD; // My variables WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; // My Func void BmpFil

我对memcpy函数有问题。我尝试从字符数组复制部分数据,但没有成功

// Types
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;

// My variables
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;

// My Func
void BmpFileHeader::setFileHeader(char* header)
{
    // header -> 42 4D BB E6 00 00 00 00 00 00 36 00 00 00
    char* pointerOfHeader = header;
    std::memcpy(&bfType, header, sizeof(WORD));
    pointerOfHeader+=2;
    std::memcpy(&bfSize, pointerOfHeader, sizeof(DWORD));
    pointerOfHeader+=4;
    std::memcpy(&bfReserved1, pointerOfHeader, sizeof(WORD));
    pointerOfHeader+=2;
    std::memcpy(&bfReserved2, pointerOfHeader, sizeof(WORD));
    pointerOfHeader+=2;
    // This point, pointerOfHeader is 36(catched with debugging)
    std::memcpy(&bfOffBits, pointerOfHeader, sizeof(DWORD));
 }

除了
bOffBits
(示例795026077192478774),我所有的变量都取真值。我试图改变尺寸,但没有成功。我遗漏了什么?

编译器似乎将
无符号long
视为64位量,但Win32 API将
DWORD
定义为无符号32位值。尝试:

typedef uint32_t DWORD;

你说“pointerOfHeader是36”是什么意思?它应该是
header+10
导入二进制数据时,您需要注意endian问题。您传入的
char*header
有多长?你是不是太过分了?如果您的环境将
unsigned long
定义为64位,那么您应该在增量行中使用
sizeof()
,而不是硬编码的数字。您试图读入
bfOffBits
的4个字节是
36 00 00
,即十进制
54
(这是BMP文件的正确偏移量)
bOffBits
被声明为
DWORD
,如果它是32位类型,则不应能够保存
795026077192478774
(0x6E550000000036)的值。但是,作为64位类型,它可以,但是其中4个字节将是未定义的,因为它们将从您正在读取的头后面的内存中读取。或者
无符号int
,如果编译器将
int
视为4字节类型。为,但这仍然是一个if。使用
uint32\u t
要么大小正确,要么根本无法编译-不可能出错。我使用的是Ubuntu和bfSize(unsigned long)变量take true value。你有什么建议?@Yavuz:bfSize的正确值可以解释为:(a)32位bfSize值后的四个尾随的00字节(将加载到64位值的上32位),以及(b)手动将指针递增4,当编译器实际生成读取8字节的代码时,我想说它不仅出现了:根据定义,字节、字和DWORD分别是8位、16位和32位类型。除了
typedef uint8字节以外的任何内容;typedef uint16_t字;类型定义uint32_t DWORD是错误的。