Java:使用大数据大小的通用BaseN编码器/解码器

Jol*_*nar 5 java string encoder converter base-n

我在Java中寻找一个不错的BaseN编码器(带有自定义字符集),不受输入数据大小(字节数组)的限制.

像这样的东西:

https://github.com/mklemm/base-n-codec-java

但对于"无限制"的数据长度没有任何不必要的内存/性能损失和"BigInteger滥用魔法".只是作为标准BASE64编码器工作的东西,但普遍适用于任何基础/字符集.任何解决方案或想法如何实现这一点都受到欢迎.

也许,如果有人有apache BaseNCodec的经验:

https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/BaseNCodec.html

它看起来很有前景,但它是一个抽象类,并且可用的实现看起来比从头开始看起来更难.


我需要它的二进制数据,自定义字符集编码器(其中字符的集合中的数量是可变的,"ABCDE" = Base5,"ABCDE-+*/." = Base10,...).
更新: 来自GitHub(上图)的"Base N Codec"似乎有些错误,所以我最后使用了以下代码:

https://dzone.com/articles/base-x-encoding

Gle*_*est 4

一般答案:否。特殊情况:是的,碱基为 2 的幂。

为什么?因为Q中的思想处于“激烈竞争”(实际上可能是“矛盾”)。

  1. 作为输入,您希望支持某个基数为 N 的无限整数(将其视为 BigIntegerBaseN)。作为输出,您希望支持某个基数 M 中的无限整数(将其视为 BigIntegerBaseM)。
  2. 您想要执行基数转换 - 这在数学上定义为一系列(乘法和加法)和除法。请参阅http://www.cut-the-knot.org/recurrence/conversion.shtmlhttps://math.stackexchange.com/questions/48968/how-to-change-from-base-n-to-m
  3. 您希望找到一种计算此类结果的方法,而无需对 BigIntegers(在任何实现基础上)进行乘法和除法。

不进行乘法和除法计算,你能确定乘法和除法运算的结果吗?不。这是一个矛盾。根据定义,当您获得结果时,您就已经执行了计算。

所以这不是能不能避免计算的问题,而是如何简化计算的问题。

  • 如果N和/或M是以2的幂为底数,那么乘法/除法可以通过简单的位移位来计算=与主要流线化相同的计算。这可以通过避免 BigInteger 计算来完成。
  • 否则,您可以缓存某些重复的计算,将中间结果存储在数组或HashMap中,然后您可以通过简化获得相同的计算。但仍然需要 BigInteger 计算(但避免了冗余重复)。

希望对您的方法有所帮助。:)