C++ 将字符数组强制转换为整数
编辑:已更正错误的num2类型 你好, 我有一些已知大小的字符数组,其中包含从二进制文件读取的原始整数数据 所有这些数组的大小都是整数 我想问一下,假设原始数据和运行此代码的计算机的端点一致,以下操作在所有正常情况下是否安全和准确C++ 将字符数组强制转换为整数,c++,c,type-conversion,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
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 */
chararr1[4]={…};
char arr2[2]={…};
uint32_t num1=*静态_投射(arr1);/*或num1=*(uint32_t*)arr1在C中*/
uint16_t num2=*静态_投射(arr2);/*或num2=*(uint32_t*)在C中的arr2*/
谢谢大家! 这应该是安全的:
char arr1[4] = { ... };
uint32_t num1;
memcpy(&num1, arr1, sizeof num1);
但是为什么
arr2
只有2个字节大?这是打字错误吗?更安全的方法是使用宏(例如MAKEDWORD)将字节按正确的顺序排列。如果您确定数组正确对齐,则不应该出现问题(考虑到endianness)
然而,在代码中,我不知道你在用arr2做什么,因为它是16位的,你从中读取的是32位的量。是的,这应该很好(在你的endianness假设下),因为这些字节在内存中的表示形式是相同的,无论它被解释为字节数组还是整数
实际上,您所做的只是更改类型,而不是数据。这在技术上是安全的,但我会考虑以下几点:
- 添加编译时断言以验证大小。你确定你的字符数组等于sizeof(你的int类型)吗?您的
就是一个很好的例子,说明了这一点的重要性——您的输入错误会导致未定义的行为num2
- 以对齐为例。是否确定字符数组位于4字节边界上(假设int为4字节)?例如,如果您试图从未对齐的指针读取int,PowerPC将崩溃
- 您应该使用一个接头
union charint32 {
char arr1[4];
uint32_t num;
};
这将为您简化存储和强制转换。因为它是一个二进制文件,您最好将原始整数读入整数数组。一次不要声明多个变量。它会导致微妙的错误。直接将字符内存强制转换为整数仅适用于具有字节对齐方式的CPU,而不适用于字对齐方式。如果您只/总是在英特尔x86上运行,那就不会有问题。@chrisaycock嗯。。。其实我是。。。(顺便说一句,我不认为一次声明>1个变量有任何问题……我认为这只是个人偏好。)相应整数的类型在我的程序中由一些模板元编程代码确定,这样就保证了正确的类型。有没有办法验证字符数组是否真的位于4字节边界内?获取其地址并检查其对齐方式。@Cameron:谢谢!顺便说一句,您还需要在英特尔CPU上使用对齐指针-它不会崩溃,但速度会慢得多,因为CPU内部需要提取两个单词并将它们粘贴在一起。威尔!(arr%4)您要做什么?或者我把问题简化了?只要字节顺序相同,这就可以工作,并且不会有数据类型对齐问题。+1。这会奏效的。它不符合C++标准,但这可能是违反规则之一。@ DIBLIN:只要你控制代码部署的地方,你就可以做到。