解析二进制数据

时间:2011-09-22 22:31:43

标签: java android parsing binary binary-data

我有一个通过蓝牙以二进制形式接收数据的应用程序。我使用输入流从bluetoothsocket到byte []读取数据。但我必须解析所有消息,因为它们必须具有给定的格式才有效。所有消息都是二进制的。

我的解决方案是将byte []转换为字符串,然后拆分字符串并解析所有收到的消息。

要解析的数据示例: 0000000010000001

我应该知道前8个零是标题,10000001是真实数据。

我的想法是创建一个字符串(来自byte []),代表 - > 0000000010000001 使用新的String(byte []) 然后将整个字符串拆分为一个字节并检查值,如:

string1有00000000 string2有10000001

我知道8个零是标题,因此string2具有数据的表示。

我的问题是关于这种方法的效率。这是在移动环境中执行此操作的最佳方法吗?

3 个答案:

答案 0 :(得分:2)

解析二进制数据的字符串操作在速度,内存消耗方面效率非常低,并且还给垃圾收集器带来了相当大的负担 - 因为你总是生成新的字符串对象并立即忘记它们。

在Java中,您有多种选择可以做得更好:

  • DataInputStream:是InputStream的包装器,您可以直接从流中读取字节,短路,长整数,双精度等。
  • NIO使用ByteBuffers和“派生”类型,如ShortBuffer ...这些对于批量数据传输和二进制解析都很有用。

只要您的数据是字节对齐的,这些都是简单的方法。如果情况并非如此 - 那么,请更好地学习如何使用&|~<<>>等运算符进行位操作。

我的建议是你尽可能坚持DataInputStream

答案 1 :(得分:0)

字符串确实是最有效的方法。

如果您的二进制0000000010000001实际上是byte[] {0, 0, 0, 0, 2, 0, 0, 1}十进制,那么只需检查b[0] == b[1] == b[3] == b[4] == 0

编辑:忽略“十进制”部分,只要您只想检查数组是否以00000000开头(即4个零字节)

,它就无关紧要了

答案 2 :(得分:0)

仅供参考,有free OSS library called Java Binary Block Parser (JBBP),它与Android(2.1+)兼容,它只允许以文本格式描述数据结构并自动解析数据流(或数组),如果你想解析整个流到位然后它可以在单个字符串

中执行
byte [] parsedBits = JBBPParser.prepare("bit:1 [_];").parse(new byte[]{1,2,3,4,5}).findFieldForType(JBBPFieldArrayBit.class).getArray();