我需要一些方法来将 BigInt 转换为字节数组,就像在 swift 中的 java 一样



我不得不将 BigInt 转换为字节数组,就像在 swift 中的 java 中一样。attaswift/BigInt 只能在不签名的情况下转换 UInt。我可以在 swift 上做什么?如何将签名转换或添加到字节数组?左上角字节中的 0 并不总是工作。

爪哇代码

java.math.BigInteger.toByteArray()

半工作斯威夫特代码

BigUInt.serialize()

我的问题比这个问题更复杂(Swift BigInt to [UInt8])。我需要考虑字节数组中的符号。

我想

我做了正确的扩展代码。

如果您发现任何错误,请写信。

extension BigInt {
public func serialize() -> Data {
    var array = Array(BigUInt.init(self.magnitude).serialize())
    if array.count > 0 {
        if self.sign == BigInt.Sign.plus {
            if array[0] >= 128 {
                array.insert(0, at: 0)
            }
        } else if self.sign == BigInt.Sign.minus {
            if array[0] <= 127 {
                array.insert(255, at: 0)
            }
        }
    }
    return Data.init(bytes: array)
}
public init(_ data: Data) {
    var dataArray = Array(data)
    var sign: BigInt.Sign = BigInt.Sign.plus
    if dataArray.count > 0 {
        if dataArray[0] >= 128 {
            sign = BigInt.Sign.minus
            if dataArray.count > 1 {
                if dataArray[0] == 255, dataArray.count > 1 {
                    dataArray.remove(at: 0)
                } else {
                    dataArray[0] = UInt8(256 - Int(dataArray[0]))
                }
            }
        }
    }
    let magnitude = BigUInt.init(Data.init(bytes: dataArray))
    self .init(sign: sign, magnitude: magnitude)
}

}

最新更新