2010-12-07 205 views
3

编辑:错误的num2类型已被更正。将字符数组转换为整数

您好,

我有一个包含从一个二进制文件中读取原始整数数据已知大小的一些字符阵列。

所有这些数组的大小都有一个整数的大小。

我想问问以下操作在所有正常情况下是否安全准确,假设原始数据的末端性和运行此代码的计算机一致。

char arr1[4] = { ... }; 
char arr2[2] = { ... }; 

uint32_t num1 = *static_cast<uint32_t*>(arr1); /* OR num1 = *(uint32_t*)arr1 in C */ 
uint16_t num2 = *static_cast<uint16_t*>(arr2); /* OR num2 = *(uint32_t*)arr2 in C */ 

谢谢!

+3

既然它是一个二进制文件,你最好将原始整数读入一个整数数组。 – chrisaycock 2010-12-07 19:19:56

+1

不要一次声明多个变量。它可能导致微妙的错误。 https://www.securecoding.cert.org/confluence/display/seccode/DCL04-C.+Do+not+declare+more+than+one+variable+per+declaration – 2010-12-07 19:23:22

+0

直接将字符内存转换为一个整数只能工作在字节对齐的CPU上,而不是字对齐。如果你只是/总是在Intel x86上运行,那不会是一个问题。 – 2010-12-07 19:36:26

回答

3

这在技术上是安全的,但也有几件事情我会考虑:

  • 添加编译时断言,以验证大小。你是否确定你的char数组等于sizeof(your_int_type)?您的num2就是一个很好的例子,说明这很重要 - 您的错字会导致未定义的行为。
  • 考虑对齐。你确定你的char数组是在一个4字节的边界上(假设你的int是4个字节)?例如,如果您尝试从未对齐的指针读取一个int,PowerPC会崩溃。
1

这应该是安全的:

char arr1[4] = { ... }; 

uint32_t num1; 

memcpy(&num1, arr1, sizeof num1); 

但为什么只有arr2 2个字节大?这是一个错字吗?

0

更安全的方法是使用宏(例如MAKEDWORD)将字节按正确顺序排列。

0

如果你确定数组是正确对齐的,那么应该没有问题(给定字节序)。

然而,在代码中,我不知道你在做什么,因为它是16位,而你正在读取一个32位的数量。

0

是的,这应该可以正常工作(在您假定的字节顺序下),因为这些字节在内存中的表示是相同的,无论它是解释为字节数组还是整数。

真的,你所做的只是改变类型而不是数据。

5

您应该使用联合。

union charint32 { 
    char arr1[4]; 
    uint32_t num; 
}; 

这会为您简化存储和投射。