0

我有一大堆类型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);
4

2 回答 2

1

没关系,就像“它不会崩溃”一样,但这是非常可怕的代码。

假设字符数组中的位置在 4char秒内包含一个 32 位整数,您想将其用作整数,您会遇到需要处理的字节顺序问题。

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

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

最好逐字节提取值,因为这样您就可以明确说明您希望每个字节表示什么。

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

这是有效的,因为移位表达式在应用移位之前提升了它们的左侧unsigned int

于 2013-07-08T12:16:42.073 回答
0

It depends on what you are trying to do. If you will copy 4 bytes of integer with sign to integer without sign or if you will skip endiannes (if any used) you will get different result than you should have. For compiler it looks ok.

于 2013-07-08T12:27:10.950 回答