Java:处理大数据的通用 BaseN 编码器/解码器

标签 java string converter encoder 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

最佳答案

一般答案:否。特殊情况:是,对于基数 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 计算(但避免了多余的重复)。

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

关于Java:处理大数据的通用 BaseN 编码器/解码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40507330/

相关文章:

javascript - 计算数组中出现次数并获取最高值的简单方法(词袋)

c# - 有没有办法在 string.contains() 方法中评估多个字符串?

json - grails.converters.JSON 除了少数属性

java - JToggleButton 截断标签文本

java - Selenium 网络驱动程序。从 div 列表中选择元素

Java:在重写文件之前检查文件是否需要更新的最佳方法是什么?

java - JAXB注释问题

java - 初始化期间分配 null 的字符串数组中的空指针异常

java - 需要为 TextView 格式化货币

wpf - WPF转换器是如何执行的?