复制到更大的变量

时间:2013-07-08 10:23:55

标签: c++ memcpy

我有一个大型uint8_t (uint8_t mydata[1000])类型的数组。我只想从这个大型数组中复制4字节长度的数据。如果我将4个字节的数据复制到64位整数变量中,这样可以吗?或者我应该将目标变量定义为4字节长度,如uint32_t

uint8_t mydata[1000];

uint64_t mysentS; //Is this okay when coping 4 bytes of data or should it be uint32_t?
uint64_t mysentUS;

memcpy(&mysentS, &mydata[16], 4);
memcpy(&mysentUS, &mydata[20], 4);

2 个答案:

答案 0 :(得分:1)

没关系,因为“它不会崩溃”,但这是非常可怕的代码。

假设字符数组中的位置包含4 char中的32位整数,您希望将其用作整数,则会遇到需要处理它的endianness个问题

目前尚不清楚复制到uint64_t的“第一个”(地址方式)字节可以获得您想要的值,这取决于当前机器的字节顺序。

在小端机器上它可以工作,但在大端机器上它不会。

最好逐字节提取值,从那以后你就可以明确表示你希望每个字节表示什么。

/* Extract 32-bit little-endian value. */
mysentS = (mydata[16] << 0)  + (mydata[17] << 8) +
          (mydata[18] << 16) + (mydata[19] << 24);

这是有效的,因为在应用班次之前,班次表达式的左侧被提升为unsigned int

答案 1 :(得分:0)

这取决于你想要做什么。如果你将带有符号的4个字节的整数复制到没有符号的整数,或者如果你将跳过endiannes(如果使用的话),你会得到与你应该有的不同的结果。对于编译器,它看起来没问题。