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

Correctly converting binary data to type from char *

本文关键字:转换 类型 char 二进制 数据 正确地      更新时间:2023-10-16

我有一个固定格式的二进制数据数组,所以前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的QDataStream,它抽象了它,但我被为什么这些方法不起作用难住了。

如果有区别的话,文件格式是小端序的。

我今天已经打过这个词了。字节顺序。你考虑过这个问题吗?我还假设,您指的是memcpy而不是memset。

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

编辑。

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

*(uint32_t*)vaue

你现在所做的,你正在打印第一个字符的数值

我的做法是:

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

我假设您已经知道关于端序的潜在问题。

如果顺序是你问题的重要组成部分,我强烈建议你阅读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);