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)
但实际上你应该将你的代码提取到它自己的函数中,并确保:
sizeof(int) == 4static, dynamic, const, reinterpret)假设一个具有32位整数的小端机器,您可以:
char s_num[4] = {0xAF, 0x50, 0x28, 0x1};
int t_num = *((int*)s_num);
Run Code Online (Sandbox Code Playgroud)
把它分成几步:
s_num是一个数组,可以解释为指向其第一个元素的指针(char*此处)s_num到int*,因为(1) -这是确定投三分球具有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风格的强制转换.