uint8 - withunsafebytes swift 4




往返數據的往返Swift數字類型 (2)

由於Swift 3傾向於 Data 而不是 [UInt8] ,我試圖找出最有效/慣用的編碼/解碼方式將各種數字類型(UInt8,Double,Float,Int64等)作為數據對象。

對於使用[UInt8] 這個答案 ,但它似乎使用了我在Data上找不到的各種指針API。

我想基本上一些自定義擴展看起來像:

let input = 42.13 // implicit Double
let bytes = input.data
let roundtrip = bytes.to(Double) // --> 42.13

真正逃避我的部分,我通過一堆文檔查看,是如何從任何基本結構(所有數字都是)獲得某種指針的東西(OpaquePointer或BufferPointer或UnsafePointer?)。 在C中,我只是在它前面拍一個&符號,然後就去了。


就我而言, 的答案有所幫助,但結果卻被顛倒了。 所以我對他的代碼進行了一些小改動:

extension UInt16 : DataConvertible {

    init?(data: Data) {
        guard data.count == MemoryLayout<UInt16>.size else { 
          return nil 
        }
    self = data.withUnsafeBytes { $0.pointee }
    }

    var data: Data {
         var value = CFSwapInt16HostToBig(self)//Acho que o padrao do IOS 'e LittleEndian, pois os bytes estavao ao contrario
         return Data(buffer: UnsafeBufferPointer(start: &value, count: 1))
    }
}

這個問題與LittleEndian和BigEndian有關。


您可以使用 withUnsafePointer 獲取指向 可變 對象的不安全指針:

withUnsafePointer(&input) { /* $0 is your pointer */ }

我不知道為不可變對象獲取一個的方法,因為inout運算符只適用於可變對象。

這與你所鏈接的答案有關。





swift-data