簡體   English   中英

如何在 Swift 中將 Int 轉換為 NSData?

[英]How to convert an Int into NSData in Swift?

在 Objective-C 中,我使用以下代碼

  1. 將一個Int變量轉換為NSData ,一個字節包。

     int myScore = 0; NSData *packet = [NSData dataWithBytes:&myScore length:sizeof(myScore)];
  2. 將轉換后的NSData變量用於方法中。

     [match sendDataToAllPlayers: packet withDataMode: GKMatchSendDataUnreliable error: &error];

我嘗試將 Objective-C 代碼轉換為 Swift:

var myScore : Int = 0

func sendDataToAllPlayers(packet: Int!,
            withDataMode mode: GKMatchSendDataMode,
            error: NSErrorPointer) -> Bool {

            return true
}

但是,我無法將Int變量轉換為NSData並將其用作 a 方法。 我怎樣才能做到這一點?

使用 Swift 3.x 到 5.0:

var myInt = 77
var myIntData = Data(bytes: &myInt, 
                     count: MemoryLayout.size(ofValue: myInt))

在當代版本的 Swift 中,我會這樣做:

let score = 1000
let data = withUnsafeBytes(of: score) { Data($0) }
e8 03 00 00 00 00 00 00 

並將該Data轉換回Int

let value = data.withUnsafeBytes {
    $0.load(as: Int.self)
}

請注意,在處理數字的二進制表示時,尤其是在與某些遠程服務/設備交換時,您可能希望明確字節順序,例如

let data = withUnsafeBytes(of: score.littleEndian) { Data($0) }
 e8 03 00 00 00 00 00 00 

並將該Data轉換回Int

let value = data.withUnsafeBytes {
    $0.load(as: Int.self).littleEndian
}

與大端格式,也稱為“網絡字節順序”:

let data = withUnsafeBytes(of: score.bigEndian) { Data($0) }
 00 00 00 00 00 00 03 e8

並將該Data轉換回Int

let value = data.withUnsafeBytes {
    $0.load(as: Int.self).bigEndian
}

不用說,如果您不想擔心字節順序,您可以使用一些既定標准,如 JSON(甚至 XML)。


對於 Swift 2 版本,請參閱此答案的先前修訂版

您可以通過以下方式進行轉換:

var myScore: NSInteger = 0
let data = NSData(bytes: &myScore, length: sizeof(NSInteger))

對於任何整數類型:

extension FixedWidthInteger {
    var data: Data {
        let data = withUnsafeBytes(of: self) { Data($0) }
        return data
    }
}

例子:

let data = 1.data

Swift 5 ,添加另一個選項。

NSData舊了,仍然有效

寫入數據:

let buffer = NSMutableData()
let size = MemoryLayout<UInt>.size
let big = 1000
let small = 10
withUnsafeBytes(of: big, { (p) in
      let bufferPointer = p.bindMemory(to: UInt.self)
      if let address = bufferPointer.baseAddress{
             buffer.append(address, length: size)
      }
})

withUnsafeBytes(of: small, { (p) in
      let bufferPointer = p.bindMemory(to: UInt.self)
      if let address = bufferPointer.baseAddress{
           buffer.append(address, length: size)
      }
 })

讀取數據:

if let d = buffer.copy() as? Data{
     var big: UInt = 0
     var small: UInt = 0
     let size = MemoryLayout<UInt>.size
     let meta = NSData(data: data)
     meta.getBytes(&big, range: NSRange(location: 0, length: size))
     meta.getBytes(&small, range: NSRange(location: size, length: size))

     print("big:", big, "\nsmall:", small)
    //  big: 1000 
    //  small: 10 
}

你知道內存布局,放入內存的數據,

然后把它們准確地放出來。

unsafe方法很有趣

使用此初始化程序將每個數組轉換為數據

Data(element: Sequence)

例子:

let myArr     = [12,45,67,898, 100]
let myArrData = Data(myArr)

根據您使用的 Int 的大小,一種直接的方法是使用 UInt8 序列初始化數據:

let value: Int = 100
let data = Data([UInt8(value)])
// OR
let data = Data([0xFF, 0xFE])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM