-3

我有一个 java 后端,它使用字节读取/写入带有 javascript 前端的任意精度数字。

在 Java 方面,我只是这样做:

new BigInteger("123").toByteArray()

医生说:

Returns a byte array containing the two's-complement 
representation of this BigInteger.

在 javascript 方面,我需要将字节读入 javascript 的 BigInt,反之亦然。

我让 javascript 将字节读入 BigInt,如下所示:

const hex = Buffer.from(bytes).toString('hex')
let big = BigInt('0x' + hex)
if (a[0] & 0x80) {
  const negative = BigInt('0x1' + '0'.repeat(hex.length))
  big -= negative
}

但是将 BigInt 转换为字节似乎非常棘手。我环顾四周,发现其他解决方案都只覆盖正数而不是负数

4

1 回答 1

0

在挖掘并理解了二进制补码表示之后,我正在回答我自己的问题:

const big0 = BigInt(0)
const big1 = BigInt(1)
const big8 = BigInt(8)  

function bigToUint8Array(big: bigint) {
  if (big < big0) {
    // work out how long is the big int in bits and add 1
    const bits: bigint = (BigInt(big.toString(2).length) / big8 + big1) * big8  
    // create a BigInt that's 100000... of length of big + 1
    const prefix1: bigint = big1 << bits
    big += prefix1
  }
  let hex = big.toString(16)
  if (hex.length % 2) {
    hex = '0' + hex
  }
  const len = hex.length / 2
  const u8 = new Uint8Array(len)
  var i = 0
  var j = 0
  while (i < len) {
    u8[i] = parseInt(hex.slice(j, j + 2), 16)
    i += 1
    j += 2
  }
  return u8
}
于 2020-08-19T10:24:12.787 回答