我目前处于停滞状态,无法正确输入信息类型。
我获得了一个二进制数据缓冲区,可以从char*
访问,需要提取它存储的所有信息。我知道我应该进行类型转换,但我做错了什么!
atoi
,atol
,atof
等功能不起作用,因为它不是一串数字,而更像是一串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 int
和unsigned int
的值都不正确,但double
都是正确的。我不明白如何正确地将一串二进制数据类型转换为char
,long int
和unsigned int
类型。有人有任何想法吗?
答案 0 :(得分:3)
这很可能是endianness问题。
整数0x00001034可以按小端或大端存储,如下所示:
{ 0x00, 0x00, 0x10, 0x34 }
{ 0x34, 0x10, 0x00, 0x00 }
我建议阅读这篇文章:
此外,您不应该假设long int
或unsigned 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所说,小心对齐。并非所有类型都允许从任何字节地址开始。