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

Correctly converting binary data to type from char *

我有一个固定格式的二进制数据数组,所以前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。

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

编辑。

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

*(uint32_t*)vaue

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

我的做法是:

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

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

如果字节顺序是您问题的重要组成部分,我强烈建议您阅读 Rob Pike 的精彩 post: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);