我有一个固定格式的二进制数据数组,因此前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
来抽象它,但我很难理解为什么这些方法都不起作用。
如果有任何区别,文件格式是小端。
答案 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);