【问题标题】:How to convert a float value to byte array in swift?如何快速将浮点值转换为字节数组?
【发布时间】:2016-08-17 04:36:21
【问题描述】:

我用来获取字节数据的代码,但我没有得到浮点值的正确字节数据

let count = data.length / sizeof(UInt32)

// create array of appropriate length:
var array = [UInt32](count: count, repeatedValue: 0)

// copy bytes into array
data.getBytes(&array, length:count * sizeof(UInt32))

print(array)

【问题讨论】:

  • 输入数据到底是什么,预期的结果是什么?标题说“将浮点值转换为字节数组”,而您的代码执行“NSData 到 UInt32 数组”,所以我不清楚您的问题:)
  • 您好感谢您的回复,如果我有浮点值,我想将该浮点值转换为字节。所以让我知道我该怎么做?
  • 请举例?您想要二进制的 IEEE 754 表示还是 integer.fraction 表示?
  • 假设例如 float 值是 40.0 ,我希望这个 float 值在 NSData 中转换,然后反过来也将 nsdata 转换为 float。

标签: swift floating-point int byte


【解决方案1】:

FloatNSData:

var float1 : Float = 40.0
let data = NSData(bytes: &float1, length: sizeofValue(float1))
print(data) // <00002042>

...返回Float:

var float2 : Float = 0
data.getBytes(&float2, length: sizeofValue(float2))
print(float2) // 40.0

(同样适用于其他“简单”类型,如DoubleInt, ...)

Swift 3 更新,使用新的Data 类型:

var float1 : Float = 40.0
let data = Data(buffer: UnsafeBufferPointer(start: &float1, count: 1))
print(data as NSData) // <00002042>

let float2 = data.withUnsafeBytes { $0.pointee } as Float
print(float2) // 40.0

(另见round trip Swift number types to/from Data

Swift 4 更新 及更高版本:

var float1 : Float = 40.0
let data = Data(buffer: UnsafeBufferPointer(start: &float1, count: 1))

let float2 = data.withUnsafeBytes { $0.load(as: Float.self) } 
print(float2) // 40.0

备注: load(as:) 要求数据正确对齐,因为 Float 将位于 4 字节边界上。参见例如round trip Swift number types to/from Data 适用于任意对齐数据的其他解决方案。

【讨论】:

  • Float(bitPattern: UInt32(bigEndian: data.withUnsafeBytes { $0.pointee } )) 此数据与浮点转换有什么不同,因为它输出不同的值实际上我需要反转这意味着浮点数到数据,但您答案中的上述代码未按预期转换,请帮助跨度>
  • 请注意,此处显示的 Swift 3 版本现在使用 Swift 5 生成警告:Initialization of 'UnsafeBufferPointer&lt;Self&gt;' results in a dangling buffer pointer
  • @featherless:我收到不同的警告“'withUnsafeBytes' 已被弃用”,我已经更新了代码。它现在应该在没有警告的情况下编译。
  • 感谢马丁的更新。新代码确实可以工作+编译,但看起来它不能处理未对齐的数据。请参阅github.com/jverkoey/BinaryCodable/pull/58/files,了解我根据 swift-nio 的数字转换实现实施的修复:github.com/apple/swift-nio/blob/…
  • @featherless:没错,load(as:) 要求数据正确对齐。 (另请参阅 Swift 论坛中的 forums.swift.org/t/built-in-unaligned-loads/19664。)对于任意对齐的数据,我在这里写了一些东西 stackoverflow.com/a/38024025/1187415,这与您的链接中的方法基本相同。
【解决方案2】:

Swift 5解决方案

Float[UInt8]

extension Float {
   var bytes: [UInt8] {
       withUnsafeBytes(of: self, Array.init)
   }
}

用法:

let number: Float = 36.5
let bytes = number.bytes

[UInt8]Float

bytes.withUnsafeBytes {
    $0.load(fromByteOffset: 0, as: Float.self)
}

要转换为数据,只需将字节数组转换为Data

let data = Data(bytes)

【讨论】:

    猜你喜欢
    • 2021-06-04
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多