如何将char数组转换为单个整数?

sep*_*oad 8 c++ png integer casting char

我正在尝试阅读PNG文件的内容.

您可能知道,所有数据都以4字节方式写入png文件,包括文本和数字.因此,如果我们有数字35234,则以这种方式保存:[1000] [1001] [1010] [0010].

但有时数字较短,所以第一个字节为零,当我读取数组并将其从char*转换为整数时,我得到错误的数字.例如,[000]有时将数字误解为负数,将simetimes误解为零!

让我给你一个直观的例子:

char s_num[4] = {120, 80, 40, 1};

int  t_num = 0;

t_num = int(s_num);
Run Code Online (Sandbox Code Playgroud)

我希望我能很好地解释我的问题!

如何将这些数组转换为单个整数值?

好吧好吧,让我更改我的代码来更好地解释它:

char s_num[4] = {0, 0, 0, 13};
int  t_num;


t_num = *((int*) s_num);
cout << "t_num: " << t_num << endl;
Run Code Online (Sandbox Code Playgroud)

在这里我们必须得到13作为结果,好吗?但是再次使用这个新解决方案,答案是错误的,您可以在您的计算机上进行测试!我得到这个号码:218103808这绝对是错的!

Axe*_*xel 12

您将(char*)转换为(int).你应该做的是转换为指向整数的指针,即

t_num = *((int*) s_num));
Run Code Online (Sandbox Code Playgroud)

但实际上你应该将你的代码提取到它自己的函数中,并确保:

  1. 字节顺序是正确的
  2. sizeof(int) == 4
  3. 使用C++强制转换(即static, dynamic, const, reinterpret)


Eli*_*sky 7

假设一个具有32位整数的小端机器,您可以:

char s_num[4] = {0xAF, 0x50, 0x28, 0x1};
int t_num = *((int*)s_num);
Run Code Online (Sandbox Code Playgroud)

把它分成几步:

  1. s_num是一个数组,可以解释为指向其第一个元素的指针(char*此处)
  2. 铸造s_numint*,因为(1) -这是确定投三分球
  3. 访问转换指针所指向的整数(取消引用)

具有0xAF整数的低字节.富勒示例(C代码):

#include <stdio.h>

int main()
{
    char s_num[4] = {0xAF, 0x50, 0x28, 0x1};
    int t_num = *((int*)s_num);

    printf("%x\n", t_num);
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

打印:

12850af
Run Code Online (Sandbox Code Playgroud)

正如所料.

请注意,此方法不太可移植,因为它假定字节顺序和整数大小.如果你有一个简单的任务要在一台机器上执行,你可能会逃脱它,但对于生产质量,你必须考虑到可移植性.

此外,在C++代码中,最好使用reinterpret_cast而不是C风格的强制转换.