编辑:错误的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 */
谢谢!
答案 0 :(得分:5)
你应该使用工会。
union charint32 {
char arr1[4];
uint32_t num;
};
这将为您简化存储和投射。
答案 1 :(得分:3)
技术上是安全的,但我会考虑一些事情:
num2
就是为什么这很重要的一个很好的例子 - 你的拼写错误会导致未定义的行为。答案 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)
是的,这应该可以正常工作(在你的字节序假设下),因为这些字节在内存中的表示是相同的,无论它是被解释为字节数组还是整数。
你所做的一切都是改变类型而不是数据。