【问题标题】:I need some method to convert BigInt to Bytes array like in java in swift我需要一些方法来快速将 BigInt 转换为 Bytes 数组,就像在 java 中一样
【发布时间】:2019-05-23 02:46:01
【问题描述】:

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

Java 代码

java.math.BigInteger.toByteArray()

半工作的 Swift 代码

BigUInt.serialize()

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

【问题讨论】:

  • Swift BigInt to [UInt8]的可能重复
  • 如果当前最高字节 >= 0x80 且原始 BigInt 为正,则仅添加 0 最高字节。如果当前最高字节
  • @O.Shulzhenko:这是另一个问题。但是没问题。 0xFF 是您将其解释为的内容。它可以解释为 -1 或 255。在这种情况下,将其插入顶部以使所有字节的值加在一起的二进制补码为负(因为前一个顶部字节 = 0x80:这也将被解释为负数(设置顶部位),因此如果原始 BigInteger 为正数,则必须在顶部添加一个 0,以使整个值为正数。但是永远不要忘记签名或未签名只是解释的问题。阅读关于二进制补码的信息。
  • 其他字节只是 BigInteger 位的载体。如果编码正确,那么您应该得到与其他语言相同的值,通常是two's complement(即使内部表示可能不同)。我知道的大多数 BigInteger 实现 pretend 是二进制补码,并且将接受或生成二进制补码格式的字节数组,尽管并不总是具有相同的字节序(Java:总是大字节序,.NET 通常是小字节序)。在内部,他们经常使用符号幅度

标签: java swift biginteger bigint


【解决方案1】:

我认为我编写了正确的扩展代码。

如果发现错误请写出来。

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

}

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多