【问题标题】:Parse Binary Data解析二进制数据
【发布时间】:2011-11-23 05:56:06
【问题描述】:

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

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

要解析的数据示例: 0000000010000001

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

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

string1 有 00000000 string2 有 10000001

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

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

【问题讨论】:

标签: java android parsing binary binary-data


【解决方案1】:

仅供参考,有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();

【讨论】:

  • 这就是我一直在寻找的人:)
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      相关资源
      最近更新 更多