簡體   English   中英

Java:適用於大數據量的通用BaseN編碼器/解碼器

[英]Java: Universal BaseN encoder/decoder working with large data sizes

我正在尋找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

它看起來很有希望,但是它是一個Abstract類,可用的實現看起來比從頭開始要難。


我需要它來將二進制數據轉換為自定義字符集編碼器(其中字符集中的字符數是可變的, "ABCDE" = Base5 "ABCDE-+*/." = Base10"ABCDE-+*/." = Base10 ,...)。
更新: GitHub上的“ Base N Codec”(上面)似乎有問題,因此我在最后使用了以下代碼:

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

如果N為2的冪,則基本N編碼非常有效,因為這樣可以在固定大小的數字組和固定大小的字節之間進行轉換。

BASE64:2 6 -每位6個比特,因此4位= 24個比特= 3個字節。

否則,必須在整個長度上進行學校乘法,從而導致大量的“ BigInteger”計算。

具有N的冪的數組而不是例如被基數N重復乘/除的更快。

為了字節數組編碼為數字,可以使用N 0 ,N 1 ,N 2 ,N 3 ,...作為長度較小或相等的字節數組,並進行重復減法。

由於byte是有符號的,所以short可能更適合。 假設數字的最高字節為98,而N的次冪不等於12,則該數字約為7。

為了將數字解碼為字節數組,可以使用相同的冪。

玩得開心。

一般回答:否。特殊情況:是,以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計算(但是避免重復)。

希望對您有所幫助。 :)

您提到了兩種截然不同的方法。 Github實現中使用的BaseN算法使用的數學符號是在基數之間轉換整數。 這等效於說10與以8為基數的算術中的12或以10為基數2的算術中的1010相同。 該算法將字節流解釋為一個大數字,然后轉換為指定的基數。

Base64是一種非常不同的方法,您可以在Wikipedia Base64頁面上看到一個示例。 該算法基本上將輸入流分成每個元素6位的數組。 2 ^ 6 = 64,因此名稱為Base64。 它具有包含64個不同字符的表,並將數組(6位)中的每個元素顯示到相應的轉換表中。

我認為您需要選擇兩種方法之一,因為它們非常不同並且彼此不兼容。 至於實現細節,我認為如果選擇第二種方法,這將更容易實現,因為您基本上將流分割成固定大小的部分,並根據自己的表對其進行編碼。

第一種方法可能會變得非常復雜,因為任意算術運算都依賴於非常復雜的結構。 您可以看看現有的軟件,再看看Wikipedia的任意精度算術軟件列表

實際上,我認為您有時會很難獲得轉換字符(隨着基數的增加或位數的增加),除非您要使用整個Unicode字母:)。

希望我能有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM