正确地将二进制数据从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。
好的,我知道你说的是小端序。所以当你说它不起作用时,你确定你收到的缓冲区是小端缓存吗?如果它是由任何像样的应用程序通过网络发送的,它应该是大端的。
编辑。
好了,我知道问题了,不知道为什么我第一次错过了。进行了无效转换。应该是
*(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);
相关文章:
- 无法转换类型 C++
- 包含可变参数包的第一个可转换类型的别名的结构
- 将 std::conditional 与不可转换类型(原始与指针)一起使用
- 链接方法时出现转换类型错误
- 如何避免隐式转换类型
- 在多重继承场景中动态强制转换类型
- 编译器不支持的转换类型
- 错误调用功能无法转换类型
- 我想看到一个在整个后缀表达式的上下文中查找转换类型 id 的示例
- 对于动态类型为强制转换类型的对象,dynamic_cast失败
- 无法在初始化中转换类型
- 如何让"auto"转换类型
- 如何通过强制转换类型指针将字符数组转换为uint16_t
- 如何从新运算符+(Template类)返回具有转换类型的对象
- 带有模板的基于枚举的工厂无法转换类型
- 使用SWIG类型映射通过字符串转换类型
- 对于可转换类型,设计比循环依赖项更好
- SWIG不能正确转换类型定义
- 将类型转换扩展到可转换类型的对/元组
- 想要将字符数组的部分转换/类型转换为值