gpt4 book ai didi

arrays - 如果 NSDecimalNumber 大于 Uint64,如何将 NSDecimalNumber 转换为字节数组?

转载 作者:可可西里 更新时间:2023-11-01 01:07:56 25 4
gpt4 key购买 nike

我想将 NSDecimalNumber 转换为字节数组。另外,我不想为此使用任何库,例如 BigInt、BInt 等。

我试过这个:

static func toByteArray<T>(_ value: T) -> [UInt8] {
var value = value
return withUnsafeBytes(of: &value) { Array($0) }
}
let value = NSDecimalNumber(string: "...")
let bytes = toByteArray(value.uint64Value)

如果数字不大于 Uint64,则效果很好。但是,如果是,我们如何转换它呢?

最佳答案

问题显然是 uint64Value 的使用,它显然不能表示任何大于 UInt64.max 的值,而你的例子 59,785,897,542,892,656,787,456 比那个大。

如果你想获取 128 位尾数的字节表示,你可以使用 _mantissa 元组 UInt16 words of Decimal,并且如果需要,将它们转换为字节。例如

extension Decimal {
var byteArray: [UInt8] {
return [_mantissa.0,
_mantissa.1,
_mantissa.2,
_mantissa.3,
_mantissa.4,
_mantissa.5,
_mantissa.6,
_mantissa.7]
.flatMap { [UInt8($0 & 0xff), UInt8($0 >> 8)] }
}
}

if let foo = Decimal(string: "59785897542892656787456") {
print(foo.byteArray)
}

返回:

[0, 0, 0, 0, 0, 0, 0, 0, 169, 12, 0, 0, 0, 0, 0, 0]

无可否认,这只是推迟了问题,打破了 uint64Value 方法的 64 位限制,但仍受限于 NSDecimalNumber 固有的 128 位限制/十进制。要捕获大于 128 位的数字,您需要一种完全不同的表示形式。


注意:这还假定指数为 0。但是,如果您有一些大数字,例如4.2e101 (4.2 * 10101),指数将为 100,尾数将为 42,我敢打赌这可能不是什么你想要在你的字节数组中。再一次,这是一个太大而无法表示为单个 128 位整数的数字示例:

if let foo = Decimal(string: "4.2e101") {
print(foo.byteArray)
print(foo.exponent)
}

产量:

[42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
100

关于arrays - 如果 NSDecimalNumber 大于 Uint64,如何将 NSDecimalNumber 转换为字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53661287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com