正确地将二进制数据转换为char *中的类型

时间:2015-08-27 17:16:24

标签: c++ pointers binary

我有一个固定格式的二进制数据数组,因此前80个字节是冗余的,然后接下来的4个字节在uint32_t中指定一个数字。到目前为止,我已经尝试了几种不同的方法来获取该数字,但我似乎无法正确访问它。我尝试过的事情:

char value[4];
memcpy(value, dataBuffer+80, 4);
cout << uint32_t(*value);

for(int x = 0; x < 4; x++)
{
   value[x] = dataBuffer[80+x];
}
cout << uint32_t(*value);

还有其他一些变体。通常我只是使用Qt&#39; QDataStream来抽象它,但我很难理解为什么这些方法都不起作用。

如果有任何区别,文件格式是小端。

3 个答案:

答案 0 :(得分:3)

我今天已经输入了这个词。字节序。你有没有考虑过这个?我还假设,你的意思是memcpy而不是memset。

好的,我知道你说它是小端的。所以当你说它不起作用时,你确定你收到的缓冲区是小端吗?如果它是通过任何类型的体面应用程序通过网络发送的,那将是大端的。

EDIT。

好的,我看到了问题,不知道为什么我第一次错过了。转换无效。应该是

*(uint32_t*)vaue

你正在做什么,你正在打印第一个角色的数值。

答案 1 :(得分:2)

我这样做的方式是:

char value[4];
uint32_t num = 0;
memcpy(&num, &value[0], sizeof(uint32_t));
std::cout << num;

我假设您已经知道有关字节序的潜在问题。

答案 2 :(得分:1)

如果字节顺序是您问题的重要部分,我强烈建议您阅读Rob Pike的这篇精彩文章:http://commandcenter.blogspot.fr/2012/04/byte-order-fallacy.html

uint32_t ui =       (dataBuffer[80]<<0)
                |   (dataBuffer[81]<<8)
                |   (dataBuffer[82]<<16)
                |   (dataBuffer[83]<<24);