C语言的类型转换是个大问题



我目前在如何进行正确的类型转换信息的停顿。

我有一个二进制数据的缓冲区,从char*访问,需要取出它存储的所有信息。我知道我应该进行类型转换,但是我做错了什么!

atoi, atol, atof这样的函数不工作,因为它不是一串数字,而更像是一串需要解释为数字的01

从广义上讲,您可以将其视为以下格式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 intdouble的值都不正确,但char都是正确的。我不明白如何正确地将二进制数据字符串类型转换为类型long int, unsigned intdouble。有人知道吗?

很可能是端序问题。

整数0x00001034可以用小端或大端存储,如下所示:

  • { 0x00, 0x00, 0x10, 0x34 }
  • { 0x34, 0x10, 0x00, 0x00 }

我建议阅读这篇文章:

    用C语言编写独立于端部的代码

同样,您不应该假设long intunsigned 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所指出的,要小心对齐。并不是所有的类型都允许从任意字节地址开始

相关内容

  • 没有找到相关文章

最新更新