java 二进制数据大端转小端

上一篇 / 下一篇  2013-04-02 10:54:28 / 个人分类:测试开发

前段时间参与的一个项目中部分子系统是由C++实现的(文中将其称为系统A),测试过程中需要为系统A准备测试数据,该数据存储在MongoDB中,其中两个字段为二进制类型分别是字段F和字段G,这两个字段内容均包含两个long型一个float型一个float数组,用之前写好的java代码往MongoDB中插入测试数据,A系统读取字段F和字段G时解析错误,经排查发现是由于java字节序与C++字节序格式不一致导致java语言插入的数据C++解析出的内容错误,无奈的是我不会C++,当时想到两个方案:
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);



TAG:

 

评分:0

我来说两句

我的栏目

日历

« 2024-04-28  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 11263
  • 日志数: 7
  • 建立时间: 2013-03-22
  • 更新时间: 2013-06-18

RSS订阅

Open Toolbar