簡體   English   中英

Swift 中的 NSData 到 [Uint8]

[英]NSData to [Uint8] in Swift

我在 Swift 中找不到這個問題的解決方案(它們都是 Objective-C,它們處理的指針我認為在 Swift 中不存在以相同的形式存在)。 有沒有辦法在Swift [Uint8] NSData對象轉換為[Uint8]形式的字節數組?

如果您以稍微復雜的方式處理指針,或者通過 Swift 3 中引入的新Array構造函數,您可以避免首先將數組初始化為占位符值:

斯威夫特 3

let data = "foo".data(using: .utf8)!

// new constructor:
let array = [UInt8](data)

// …or old style through pointers:
let array = data.withUnsafeBytes {
    [UInt8](UnsafeBufferPointer(start: $0, count: data.count))
}

斯威夫特 2

Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>(data.bytes), count: data.length))

Swift 5 解決方案

數據到 [字節]

extension Data {
    var bytes: [UInt8] {
        return [UInt8](self)
    }
}

[字節] 到數據

extension Array where Element == UInt8 {
    var data: Data {
        return Data(self)
    }
}

這很有趣,但存在更簡單的解決方案。 適用於 Swift 3。當然。 我今天用了這個。

data: Data // as function parameter    
let byteArray = [UInt8](data)

就這樣! :) NSData 很容易橋接到數據。

更新:(由於安德魯科斯特評論)

斯威夫特 4.1,Xcode 9.3.1

剛剛經過重新檢查 - 一切都按預期工作。

if let nsData = NSData(base64Encoded: "VGVzdFN0cmluZw==", options: .ignoreUnknownCharacters) {
let bytes = [UInt8](nsData as Data)
print(bytes, String(bytes: bytes, encoding: .utf8))

輸出: [84, 101, 115, 116, 83, 116, 114, 105, 110, 103] 可選(“TestString”)

您可以使用NSDatagetBytes函數來獲取等效的字節數組。

由於您沒有提供任何源代碼,我將使用已轉換為 NSData 的 Swift String 內容。

var string = "Hello World"
let data : NSData! = string.dataUsingEncoding(NSUTF8StringEncoding)

let count = data.length / sizeof(UInt8)

// create an array of Uint8
var array = [UInt8](count: count, repeatedValue: 0)

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

println(array)

斯威夫特 3/4

let count = data.length / MemoryLayout<UInt8>.size

// create an array of Uint8
var byteArray = [UInt8](repeating: 0, count: count)
// copy bytes into array
data.getBytes(&byteArray, length:count)

斯威夫特 3/4

let data = Data(bytes: [0x01, 0x02, 0x03])
let byteArray: [UInt8] = data.map { $0 }

你可以試試

extension Data {
func toByteArray() -> [UInt8]? {
    var byteData = [UInt8](repeating:0, count: self.count)
    self.copyBytes(to: &byteData, count: self.count)
    return byteData
  }
}

swift 4 和圖像數據到一個字節數組。

 func getArrayOfBytesFromImage(imageData:Data) ->[UInt8]{

    let count = imageData.count / MemoryLayout<UInt8>.size
    var byteArray = [UInt8](repeating: 0, count: count)
    imageData.copyBytes(to: &byteArray, count:count)
    return byteArray

}

暫無
暫無

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

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