1

问题:如何在 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;
    }
4

1 回答 1

0

你可以

  • 将大整数右移long(以位为单位)的大小,并转换为long(丢弃所有高位字节)。这将为您提供最低阶的肢体(如数字,除了 along而不是位)。
  • 重复上述操作,直到移位的大整数(不仅仅是低位字节)的值为 0。你会想要
  • 将循环中的 s 存储long在数组中。这个 s 数组long可以通过 JNI 或您使用的任何跨语言接口传递。
  • 在另一种语言中,进行相反的操作:初始化一个空的大整数作为累加器,从高位到低位循环数组,将当前累加向左移动 的大小long,然后按位或当前 long 值到低阶位置。后期迭代的变化将使肢体进入最终位置。

这些算法应该适用于任何大型整数库(假设它们提供基本操作,如移位和转换为长整数),我想在任何语言中。这应该比转换为文本表示更快,但这种方法在更简单的实现方面更胜一筹。

于 2018-02-08T01:00:39.877 回答