我有一个大型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);
答案 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(如果使用的话),你会得到与你应该有的不同的结果。对于编译器,它看起来没问题。