簡體   English   中英

使用Java序列化BigInteger,使用Botan反序列化?

[英]Serialize BigInteger in Java, deserialize with Botan?

問題 :如何轉換Java中的BigInteger以匹配Botan BigInt編碼?

我使用Botan在Java和C ++應用程序之間進行通信。 Botan具有BigInt類,與BigInteger相當。 但是,轉換為字節數組時的編碼不同。

在Botan中,BigInt的編碼如下:

void BigInt::binary_encode(uint8_t output[]) const
{
   //bytes just returns the # of bytes, in my case its 32 always
   const size_t sig_bytes = bytes();
   for(size_t i = 0; i != sig_bytes; ++i)
      output[sig_bytes-i-1] = byte_at(i);
}

在Java中,其編碼為:

 public byte[] toByteArray() {
        int byteLen = bitLength()/8 + 1;
        byte[] byteArray = new byte[byteLen];

        for (int i=byteLen-1, bytesCopied=4, nextInt=0, intIndex=0; i >= 0; i--) {
            if (bytesCopied == 4) {
                nextInt = getInt(intIndex++);
                bytesCopied = 1;
            } else {
                nextInt >>>= 8;
                bytesCopied++;
            }
            byteArray[i] = (byte)nextInt;
        }
        return byteArray;
    }

您可以

  • 將大整數右移long的大小(以位為單位),然后轉換為long (丟棄所有高位字節)。 這樣可以使您得到最低階的肢體 (像數字一樣,除了long而不是位)。
  • 重復上述操作,直到移位的大整數(不僅是低位字節)的值為0。您將需要
  • 將循環中的long s存儲在數組中。 這個long數組可以通過JNI或您使用的任何跨語言接口傳遞。
  • 用另一種語言,請執行相反的操作:將一個空的大整數初始化為累加器,將數組從高位循環到低位,將當前累加向左移動long的大小,然后按位或當前long的值到低階位置。 后續迭代的移動將使肢體進入其最終位置。

這些算法應該適用於任何大型整數庫(假設它們提供了諸如將移位和轉換為long的基本操作),我想可以使用任何語言。 這應該比轉換為文本表示更快,但是就更簡單的實現而言,這種方法是優越的。

暫無
暫無

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

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