memcpy unsigned char to int

时间:2018-04-20 11:40:42

标签: c++ memcpy

我试图从我读过的文件中获取一个int值。诀窍是我不知道这个值放了多少字节,所以我首先读取长度八位字节,然后尝试读取尽可能多的数据字节,长度八位字节告诉我。当我尝试将数据八位字节放在一个int变量中并最终将其打印出来时出现问题 - 如果第一个数据八位字节为0,则只复制后面的数据,因此我尝试读取的int是错误的,如0x00A2与0xA200不同。如果我使用ntohs或ntohl,则0xA200被解码错误为0x00A2,因此它不能解决空洞问题。我正在使用这样的memcpy:

memcpy(&dst, (const *)src, bytes2read)   

其中dst是int,src是unsigned char *,bytes2read是size_t。

那么我做错了什么?谢谢!

1 个答案:

答案 0 :(得分:3)

您不能使用memcpy在整数中可移植地存储字节,因为标准没有指定字节的顺序,也没有说明可能的填充位。可移植的方法是使用按位运算和移位:

unsigned char b, len;
unsigned int val = 0;
fdin >> len;             // read the field len
if (len > sizeof(val)) { // ensure it will fit into an
    // process error: cannot fit in an int variable
    ...
}
while (len-- > 0) {      // store and shift one byte at a bite
    val <<= 8;           // shift previous value to leave room for new byte
    fdin >> b;           // read it
    val |= b;            // and store..
}