前段时间参与的一个项目中部分子系统是由C++实现的(文中将其称为系统A),测试过程中需要为系统A准备测试数据,该数据存储在MongoDB中,其中两个字段为二进制类型分别是字段F和字段G,这两个字段内容均包含两个long型一个float型一个float数组,用之前写好的java代码往MongoDB中插入测试数据,A系统读取字段F和字段G时解析错误,经排查发现是由于java字节序与C++字节序格式不一致导致java语言插入的数据C++解析出的内容错误,无奈的是我不会C++,当时想到两个方案:
java 二进制数据大端转小端
原创
©著作权归作者所有:来自51CTO博客作者xmanliang的原创作品,请联系作者获取转载授权,否则将追究法律责任
1.用python写个脚本插入数据,python的字节序应该和C++一致的,但python不太熟,为了赶时间放弃此方案
2.修改java代码,增加大端转小端的功能,觉得此方案花费时间不多,靠谱点!
于是写了所谓的第一版,就是想通过将数据写入ByteArrayOutputStream中后调用其toArray方法转换为二进制数组后再将此数据顺序颠倒后插入数据库中,现在想想此方法挺傻B的,单纯的认为转化下位置就OK了,写到一半觉得很麻烦,于是想到万能的谷歌,搜索后发现有人推荐使用ByteBuffer,但没找到合适的例子,于是研究了下ByteBuffer的方法终于成功了,字节序转换部分的代码示例如下:
/**
* 字段包含两个long型(长度16),一个float型(长度4),一个长度为5的float数组(长度20)
* 即总长度=16+4+20
* 初始化一个ByteBuffer,长度为40,且字节序设置为小端,然后将要插入的数据放到ByteBuffer中
*/
ByteBuffer buffer=ByteBuffer.allocate(40).order(ByteOrder.LITTLE_ENDIAN);
buffer.putLong(IID);
buffer.putLong(GID);
buffer.putFloat(similarity);
buffer.putFloat(f[0]);
buffer.putFloat(f[1]);
buffer.putFloat(f[2]);
buffer.putFloat(f[3]);
buffer.putFloat(f[4]);
//此方法并非真的清空,只是重新的位置设为0
buffer.clear();
//将ByteBuffer中的数据通过get方法写入一个二进制数据,将此数组插入数据库中即可
buffer.get(gfresult);
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
java 秒转小时工具类 hutool
java 秒转小时工具类 hutool
日期时间 Java System -
java同时处理多个数据
java同时处理多个数据的三种常用方法详解,并提供了详细的代码示例。
java 抛出异常 多线程 -
如何判断系统是大端还是小段算法
如何判断系统是大端还是小段算法,并且给出了关于内存布局的分析和例子。
大端小端 内存结构 Big #include 地址空间