【问题标题】:Encode binary data as ASCII in Java在 Java 中将二进制数据编码为 ASCII
【发布时间】:2011-11-18 12:52:55
【问题描述】:

我有一组二进制数据,我希望将其紧凑地编码为 ASCII 字符串。我打算最初使用运行长度编码压缩数据以给出一个整数序列;例如

111110001000000000000111

变成:

5o3z1o12z3o

(例如 5 个 1、3 个 0、1 个 1、12 个 0、3 个 1)。

但是,我希望将其进一步压缩成一个紧凑的 ASCII 字符串(即使用完整范围的 ASCII 字符而不是数字加上“o”和“z”的字符串)。任何人都可以推荐一种合适的方法和/或第 3 方库在 Java 中执行此操作吗?

【问题讨论】:

    标签: java encoding ascii bitset


    【解决方案1】:

    如果您的目标是压缩,只需 gzip 流。它会比你的游程编码做得更好。

    如果你出于某种原因需要它是文本,比如安全地通过旧邮件网关,我也会转向像 Base64 这样的标准编码,而不是自己编。

    但是,如果您想自己滚动:首先我要注意的是,您不需要“o”和“z”。您已经知道这些值,因为它们交替出现。假设它从 0 开始(如果不是,则编码一个初始 0 以表明有 0 个 0)。

    对数字进行文本编码是可能的,但可能效率低下。查看整数值的可变长度编码,然后对这些字节进行编码。然后以某种方式将它们“转义”为 ASCII。

    但是我们又回到了类似 Base64 的编码,第一个建议 gzip + Base64 可能比这一切都容易。

    【讨论】:

    • 谢谢 - 我去看看。我注意到 sun.misc 中提供了非公共 base64 编码器。顺便说一句,我包含了 'o' 和 'z' 分隔符,假设 0 或 1 的序列是任意长度而不是固定大小的整数。
    • Commons Codec (commons.apache.org/codec) 有编码 Base64 的代码。您仍然可以拥有任意长度的整数,而无需整数之间的完整字节分隔符。
    • @Sean,如果你要编码任意长度的整数而不使用分隔符,你怎么知道一个整数在哪里结束,下一个从哪里开始?我唯一能想到的是,您需要使用可变长度编码方案(例如,使用每个字节的最高位来表示“有更多字节”)。
    • 这正是它通常的做法。例如,Google protobufs 会这样做,一直到 MIDI 协议。
    猜你喜欢
    • 2016-10-16
    • 2015-07-21
    • 1970-01-01
    • 2016-10-02
    • 2013-02-12
    • 1970-01-01
    • 2015-08-05
    • 2019-02-20
    • 2011-08-31
    相关资源
    最近更新 更多