我目前在如何进行正确的类型转换信息的停顿。
我有一个二进制数据的缓冲区,从char*
访问,需要取出它存储的所有信息。我知道我应该进行类型转换,但是我做错了什么!
像atoi
, atol
, atof
这样的函数不工作,因为它不是一串数字,而更像是一串需要解释为数字的0
和1
。
从广义上讲,您可以将其视为以下格式char
long int
char
unsigned int
double
,现在,如果我想要第一行,我会这样做:
char temp_c1 = (char)*(buffer);
long int temp_i = (long int)*(buffer+1);
char temp_c2 = (char)*(buffer+5);
unsigned int temp_ui = (unsigned int)*(buffer+6);
double temp_d = (double)*(buffer+10);
我的long int
, unsigned int
和double
的值都不正确,但char
都是正确的。我不明白如何正确地将二进制数据字符串类型转换为类型long int
, unsigned int
和double
。有人知道吗?
很可能是端序问题。
整数0x00001034可以用小端或大端存储,如下所示:
-
{ 0x00, 0x00, 0x10, 0x34 }
-
{ 0x34, 0x10, 0x00, 0x00 }
我建议阅读这篇文章:
- 用C语言编写独立于端部的代码
同样,您不应该假设long int
或unsigned int
正好是4字节。这取决于你的计算机体系结构和编译器
With
long int temp_i = (long int)*(buffer+1);
(和其他),您可能会调用未定义的行为,因为解引用指向未对齐数据的指针,这可能会以"不正确"(<sic;意想不到的)结果。>
我的印象是你只是把去差异弄错了。就像
long int temp_i = (long int)*(buffer+1);
首先解引用一个char*
,然后获得一个char
,比如'a'
,这对于C来说只是一个(很小的)数字。然后将其强制转换为long int
。
你的意思可能是
long int temp_i = *(long int*)(buffer+1);
首先将char*
重新解释为指向long int
的指针,然后对其进行微分,将其读取为正确宽度的数字。
但是正如jørgensen所指出的,要小心对齐。并不是所有的类型都允许从任意字节地址开始