首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >快速Java二进制格式解析

快速Java二进制格式解析
EN

Stack Overflow用户
提问于 2016-03-12 11:38:49
回答 2查看 2.4K关注 0票数 5

在我们的Java应用程序套件中,我经常处理不同的二进制文件格式,即读入某些类结构并将它们写回。我需要做这样的手术:

  • 读取单个字节/短/ int /长,有时是不同的endianness (小/大)
  • 读取标志中的单个位,即 uint16_t _~_ uint16_t _ 应该变成像 A= stream.readUint16();字节tmp = stream.readUint8();b= (tmp & 0xf0) >> 4;c= (tmp & 0xf) d= stream.readUint16();
  • 以不同的编码方式读取字符串,有时使用类似于\0结尾的动态长度字符串
  • 在文件中查找(查找由某些偏移量指定的数据),了解当前位置,知道我在当前数据块中还需要解析多少
  • 最后,但同样重要的是,它应该是快速的;至少不要比在C中声明typedef struct、将它作为块读取并在内存中进行类型转换慢一个数量级。

到目前为止,我已经分析了我的选择,发现有:

  • RandomAccessFile -标准Java中最好的一种,有正确的查找和定位方法、字符串读取等,但有时由于操作中缺乏缓冲而慢得令人难以忍受;也没有对流的位级访问,也没有不同的endianness支持。
  • FileInputStream -只能读取单个字节,必须手工重建原始数据类型;不需要查找。
  • *Reader接口-基本上只能读取字节和字节数组,可以跳过、标记和重置,但是如果以reset(); skip(seekAmount);的形式多次执行查找,它们往往会泄漏内存。
  • https://github.com/raydac/java-binary-block-parser --几乎完全是我所要寻找的--即格式的声明性规范,然后,瞧,我有了类,但它本质上是一个解释器,因此有两个主要问题:(a)在高要求的环境中,它速度慢;(b)运行时生成的反射样式存在多种类型的安全问题。
  • http://preon.codehaus.org/ -有很多很棒的评论,但似乎已经不再开发了,网站已经瘫痪了:

我搜索过谷歌,我搜索过StackOverflow。这个问题-- How to parse/encode binary message formats? --解决了同样的问题,但是有着我没有的奇怪的非对齐位要求。

所以,问题是-我是不是忽略了什么,对于这个问题有什么更好的解决方案来解决我提到的所有问题吗?

EN

回答 2

Stack Overflow用户

发布于 2016-03-12 13:25:55

ByteBuffer有你需要的一切。

它也可能是纯Java中最快的选项(不包括JNI、sun.misc.Unsafe等)。

  • getgetShortgetInt等读取所有基本类型和字节数组;
  • order在BIG_ENDIAN和LITTLE_ENDIAN之间切换;
  • position用于寻找;
  • CharsetEncoderCharsetDecoder可以直接在ByteBuffer中对字符串进行编/解码;
  • FileChannel.map创建映射到文件的ByteBuffer;
  • Java堆和离开堆中有两种用于数据的ByteBuffers。
票数 7
EN

Stack Overflow用户

发布于 2016-03-12 11:55:20

我不想将此作为解决方案,但考虑到您似乎对如何在C中实现此操作有一定的了解,您可以在C中构造一个适当函数库,然后用JNI包装并在应用程序中使用它。

也许这只是“土生土长”适合于您的用例的少数情况之一?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35957170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档