memcpy unsigned char 到 int
memcpy unsigned char to int
我正在尝试从我读取的文件中获取一个 int 值。诀窍是我不知道这个值有多少字节,所以我首先读取长度八位位组,然后尝试读取长度八位位组告诉我的尽可能多的数据字节。当我尝试将数据八位字节放入一个 int 变量并最终打印它时,问题就出现了——如果第一个数据八位字节为 0,则只复制后面的数据,因此我尝试读取的 int 是错误的,如 0x00A2与 0xA200 不同。如果我使用ntohs或ntohl,那么0xA200被错误解码为0x00A2,所以它不能解决漏洞问题。我正在像这样使用 memcpy:
memcpy(&dst, (const *)src, bytes2read)
其中 dst 是 int,src 是 unsigned char *,bytes2read 是 size_t。
那我做错了什么?谢谢!
您不能使用 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..
}
我正在尝试从我读取的文件中获取一个 int 值。诀窍是我不知道这个值有多少字节,所以我首先读取长度八位位组,然后尝试读取长度八位位组告诉我的尽可能多的数据字节。当我尝试将数据八位字节放入一个 int 变量并最终打印它时,问题就出现了——如果第一个数据八位字节为 0,则只复制后面的数据,因此我尝试读取的 int 是错误的,如 0x00A2与 0xA200 不同。如果我使用ntohs或ntohl,那么0xA200被错误解码为0x00A2,所以它不能解决漏洞问题。我正在像这样使用 memcpy:
memcpy(&dst, (const *)src, bytes2read)
其中 dst 是 int,src 是 unsigned char *,bytes2read 是 size_t。
那我做错了什么?谢谢!
您不能使用 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..
}