【发布时间】:2017-03-23 06:49:51
【问题描述】:
我正在寻找一个不错的 Java BaseN 编码器(带有自定义字符集),它不受输入数据大小(字节数组)的限制。
类似这样的:
但是对于“无限”数据长度,没有任何不必要的内存/性能损失和“BigInteger 滥用魔法”。只是作为标准 BASE64 编码器工作的东西,但普遍适用于任何基本/字符集。欢迎任何解决方案或想法如何实现。
也许,如果有人有使用 apache BaseNCodec 的经验:
它看起来很有希望,但是它是一个抽象类,并且可用的实现看起来比从头开始更难。
我需要将二进制数据用于自定义字符集编码器(其中字符集中的字符数是可变的,
"ABCDE" = Base5,"ABCDE-+*/." = Base10,...)。
更新: 来自 GitHub(上图)的“Base N Codec”似乎有问题,所以我最后使用了以下代码:
【问题讨论】:
-
如果您的基数不是 2 的幂,您如何定义一个不将数据视为潜在(非常)大整数并因此需要 BigInteger 或等价物的编码?
-
@dave_thompson_085 是的,但应该“虚拟地”逐个序列地完成,如有必要(不直接使用 BigInteger),会溢出到另一个序列。否则,它将“针对相对较短的字节序列(最多约 1000 个字节)”(如github.com/mklemm/base-n-codec-java 中的状态)。
-
几乎不可能,如果“通用”是指解码/编码现有标准,如 Base85、Base64 等(不同的填充策略和分组方法)。如果你的意思是像 Integer.toString(i, radix) 那么这个用例是什么?
-
@Durandal 用例:我需要将它用于自定义字符集编码器的二进制数据(其中字符集中的字符数是可变的,
"ABCDE" = Base5,"ABCDE-+*/." = Base10,...)。 -
也许我的问题不够精确。决定性的一点是,您是否绝对需要以尽可能少的浪费位对二进制数据进行编码(将整个流视为一个数字),或者一些浪费不是问题(例如 Base85 编码在 5 个符号中编码 4 个字节,仅产生 85^5 种可能性中的 2^32 个)。如果您只是寻求使用有限的符号集对传输进行编码,接受一些浪费的位,它会将问题简化为只需选择大量符号来编码相当少的字节数。
标签: java string converter encoder base-n