代码之家  ›  专栏  ›  技术社区  ›  O. Shulzhenko

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

  •  0
  • O. Shulzhenko  · 技术社区  · 7 年前

    我需要将BigInt转换为字节数组,就像在swift中的java一样。 attaswift/BigInt只能转换UInt而无需签名。我在斯威夫特能做什么?如何将签名转换或添加到字节数组?左上字节中的0不总是工作。

    Java代码

    java.math.BigInteger.toByteArray()
    

    半工作Swift码

    BigUInt.serialize()
    

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   O. Shulzhenko    7 年前

    我想我做了正确的扩展码。

    如果你看到任何错误,请写信。

    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)
    }