[英]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
而不是位)。 long
s存儲在數組中。 這個long
數組可以通過JNI或您使用的任何跨語言接口傳遞。 long
的大小,然后按位或當前long的值到低階位置。 后續迭代的移動將使肢體進入其最終位置。 這些算法應該適用於任何大型整數庫(假設它們提供了諸如將移位和轉換為long的基本操作),我想可以使用任何語言。 這應該比轉換為文本表示更快,但是就更簡單的實現而言,這種方法是優越的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.