2013-07-08 47 views
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); 

回答

1

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

假设字符数组中的位置在4个char s中包含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

0

这取决于你正在尝试做什么。如果您将4个字节的符号整数复制为无符号的整数,或者您将跳过末尾符号(如果有的话),则会得到与您应该具有的结果不同的结果。对于编译器,它看起来没问题

相关问题