如何快速将double转换为字节数组?

我知道如何在Java中执行此操作,但是找不到Java的ByteBuffer的快速等效项,因此也找不到它的.putDouble(double value)方法。

基本上,我正在寻找这样的功能:

func doubleToByteArray(value: Double) -> [UInt8]? {

. . .

}

doubleToByteArray(1729.1729) // should return [64, 155, 4, 177, 12, 178, 149, 234]

回答:

typealias Byte = UInt8

func toByteArray<T>(var value: T) -> [Byte] {

return withUnsafePointer(&value) {

Array(UnsafeBufferPointer(start: UnsafePointer<Byte>($0), count: sizeof(T)))

}

}

toByteArray(1729.1729)

toByteArray(1729.1729 as Float)

toByteArray(1729)

toByteArray(-1729)

但是结果与您的期望相反(由于字节顺序):

[234, 149, 178, 12, 177, 4, 155, 64]

[136, 37, 216, 68]

[193, 6, 0, 0, 0, 0, 0, 0]

[63, 249, 255, 255, 255, 255, 255, 255]


添加:

func fromByteArray<T>(value: [Byte], _: T.Type) -> T {

return value.withUnsafeBufferPointer {

return UnsafePointer<T>($0.baseAddress).memory

}

}

let a: Double = 1729.1729

let b = toByteArray(a) // -> [234, 149, 178, 12, 177, 4, 155, 64]

let c = fromByteArray(b, Double.self) // -> 1729.1729


对于Xcode8 / Swift3.0:

func toByteArray<T>(_ value: T) -> [UInt8] {

var value = value

return withUnsafePointer(to: &value) {

$0.withMemoryRebound(to: UInt8.self, capacity: MemoryLayout<T>.size) {

Array(UnsafeBufferPointer(start: $0, count: MemoryLayout<T>.size))

}

}

}

func fromByteArray<T>(_ value: [UInt8], _: T.Type) -> T {

return value.withUnsafeBufferPointer {

$0.baseAddress!.withMemoryRebound(to: T.self, capacity: 1) {

$0.pointee

}

}

}


对于Xcode8.1 / Swift3.0.1

func toByteArray<T>(_ value: T) -> [UInt8] {

var value = value

return withUnsafeBytes(of: &value) { Array($0) }

}

func fromByteArray<T>(_ value: [UInt8], _: T.Type) -> T {

return value.withUnsafeBytes {

$0.baseAddress!.load(as: T.self)

}

}

以上是 如何快速将double转换为字节数组? 的全部内容, 来源链接: utcz.com/qa/426687.html

回到顶部