我正在 Java 中寻找一个不错的 BaseN 编码器(带有自定义字符集),它不受输入数据大小(字节数组)的限制。
像这样:
但对于“无限”数据长度,没有任何不必要的内存/性能损失和“BigInteger 滥用魔法”。只是作为标准 BASE64 编码器工作的东西,但普遍适用于任何基本/字符集。欢迎任何解决方案或实现方法的想法。
也许,如果有人有使用 apache BaseNCodec 的经验:
它看起来很有前途,但它是一个抽象类,而且可用的实现看起来比从头开始更难实现。
我需要它用于自定义字符集编码器的二进制数据(其中字符集中的字符数是可变的,
"ABCDE"= Base5
,"ABCDE-+*/."= Base10
,...)。
更新: 来自 GitHub(上图)的“Base N Codec”似乎有问题,所以我在最后使用了以下代码:
最佳答案
一般答案:否。特殊情况:是,对于基数 2 的幂。
为什么?因为Q里的思想在“强竞争”(其实很可能是“矛盾”)。
- 作为输入,您希望在某个基数 N 中支持无限整数(将其视为 BigIntegerBaseN)。作为输出,您需要支持某个基数 M 中的无限整数(将其视为 BigIntegerBaseM)。
- 您想进行基数转换——这在数学上被定义为一系列(乘法和加法)和除法。参见 http://www.cut-the-knot.org/recurrence/conversion.shtml和 https://math.stackexchange.com/questions/48968/how-to-change-from-base-n-to-m .
- 您想找到一种无需对 BigIntegers 进行乘法和除法(在任何实现基础上)即可计算此类结果的方法。
你能在不进行乘除运算的情况下确定乘除运算的结果吗?不。这是一个矛盾。当您得到结果时,根据定义,您已经进行了计算。
所以这不是你能不能避免计算的问题,而是如何简化它们的问题。
- 如果 N 和/或 M 以 2 的幂为底,则可以通过简单的位移计算乘法/除法 = 与主要流线法相同的计算。这可以通过避免 BigInteger 计算来实现。
- 否则,你可以缓存某些重复的计算,将中间结果存储在数组或HashMap中,然后你得到与精简相同的计算。但是仍然需要 BigInteger 计算(但避免了多余的重复)。
希望对您的方法有所帮助。 :)
关于Java:处理大数据的通用 BaseN 编码器/解码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40507330/