在C中进行类型转换,大问题

时间:2011-12-10 21:47:35

标签: c casting binary-data

我目前处于停滞状态,无法正确输入信息类型。

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

atoiatolatof等功能不起作用,因为它不是一串数字,而更像是一串0和{{1需要将其解释为数字。

从广义上讲,您可以将其视为以下格式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 intunsigned int的值都不正确,但double都是正确的。我不明白如何正确地将一串二进制数据类型转换为charlong intunsigned int类型。有人有任何想法吗?

3 个答案:

答案 0 :(得分:3)

这很可能是endianness问题。

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

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

我建议阅读这篇文章:

此外,您不应该假设long intunsigned int正好是4个字节。这取决于您的计算机的体系结构和编译器。

答案 1 :(得分:0)

使用

long int temp_i = (long int)*(buffer+1);

(和其他人),由于解除对未对齐数据的指针,您可能会调用未定义的行为,这可能会在“不正确”(< sic; unexpected)结果中表现出来。

答案 2 :(得分:0)

我的印象是你只是让derefferencing错了。像

这样的东西
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所说,小心对齐。并非所有类型都允许从任何字节地址开始。