NSData到Swift中的[Uint8]

时间:2015-08-05 00:53:08

标签: swift nsdata

我无法在Swift中找到解决这个问题的方法(所有这些都是Objective-C,它们处理的指针我不会认为在Swift中以相同的形式存在)。有没有办法在Swift中以NSData的形式将[Uint8]对象转换为字节数组?

7 个答案:

答案 0 :(得分:101)

如果您以稍微复杂的方式查看指针,或者通过Swift 3中引入的新Array构造函数,您可以避免首先将数组初始化为占位符值:

Swift 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))
}

Swift 2

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

答案 1 :(得分:37)

这很有趣,但存在更简单的解决方案。在Swift中工作3.当然。我今天用过这个。

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

这就是全部! :) NSData很容易桥接到Data。

更新:(由于Andrew Koster的评论)

Swift 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]可选(&#34; TestString&#34;)

答案 2 :(得分:21)

您可以使用getBytes的{​​{1}}函数来获取等效的字节数组。

由于您没有提供任何源代码,我将使用已转换为NSData的Swift String内容。

NSData

Swift 3/4

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 :(得分:13)

Swift 5解决方案

数据到[字节]

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

[bytes]到Data

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

答案 4 :(得分:2)

快速3/4

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

答案 5 :(得分:0)

您可以尝试

import tkinter as tk
from tkinter import ttk

class window():
    def __init__(self,root):
        self.frame=tk.Frame(root)
        self.key=tk.Button(self.frame,text='PRESS ME',command=self.wipe())
        self.box=ttk.Combobox(self.frame, options=['1','2','3'])
        self.frame.pack()
        self.key.pack()
        self.box.pack()
    def wipe(self):
        self.box.get()

master=tk.Tk()
master.geometry('400x400')
app=window(master)
master.mainloop()

答案 6 :(得分:0)

将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

}