将字符数组转换为整数

时间:2010-12-07 19:16:17

标签: c++ c type-conversion

编辑:错误的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 */

谢谢!

6 个答案:

答案 0 :(得分:5)

你应该使用工会。

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

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

答案 1 :(得分:3)

技术上是安全的,但我会考虑一些事情:

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

答案 2 :(得分:1)

这应该是安全的:

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

uint32_t num1;

memcpy(&num1, arr1, sizeof num1);

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

但是,在代码中,我不知道你在使用arr2做了什么,因为它是16位,你正在从中读取32位数量。

答案 5 :(得分:0)

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

你所做的一切都是改变类型而不是数据。