Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将字符数组强制转换为整数_C++_C_Type Conversion - Fatal编程技术网

C++ 将字符数组强制转换为整数

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

编辑:已更正错误的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 */
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:只要你控制代码部署的地方,你就可以做到。