我正在尝试从字节数组创建一个NSData
var
。
在Obj-C中,我可能会这样做:
NSData *endMarker = [[NSData alloc] initWithBytes:{ 0xFF, 0xD9 }, length: 2]
我无法找到Swift中可行的等效方法。
NSData
有一个可以接受bytes
指针的初始化器: init(bytes: UnsafeMutablePointer<Void>, length: Int)
。一个UnsafePointer
参数可以接受多种不同的东西,包括简单的Swift数组,因此你可以使用基本上和Objective-C相同的语法。当你传递数组时,需要确保将其标识为UInt8
数组,否则Swift的类型推断会认为你要创建一个Int
数组。
var endMarker = NSData(bytes: [0xFF, 0xD9] as [UInt8], length: 2)
你可以在苹果公司的与C API交互文档中了解有关不安全指针参数的更多信息。
var foo : Byte[] = [0xff, 0xD9]
var data = NSData(bytes: foo, length: foo.count)
println("\(data)")
输出: ff d9
var data = NSData(bytes: [0xFF, 0xD9] as Byte[], length: 2)
println("\(data)")
输出:ff d9
编辑:啊,你需要写成'as Byte[]',这样结果就一样了。
更新为Swift 2.2版
var foo:[UInt8] = [0xff, 0xD9]
var data = NSData(bytes: foo, length: foo.count)
print("\(data)")
输出: ff d9
var data = NSData(bytes: [0xFF, 0xD9] as [UInt8], length: 2)
print("\(data)")
输出: ff d9
Byte
了。取而代之的是,写成[Uint8]
而不是Byte[]
。 - Albert Vila CalvoUInt8
。 - Dan Rosenstark在Swift 3中,您不需要扩展Data,可以这样做:
let bytes:[UInt8] = [0x00, 0x01, 0x02, 0x03]
let data = Data(bytes: bytes)
print(data as NSData)
打印“<00010203>”
再次获取字节数组:
let byteArray:[UInt8] = [UInt8](data)
针对Swift 5,我已经创建了另一个Data
扩展,它运行良好。
extension Data {
init<T>(fromArray values: [T]) {
var values = values
self.init(buffer: UnsafeBufferPointer(start: &values, count: values.count))
}
func toArray<T>(type: T.Type) -> [T] {
let value = self.withUnsafeBytes {
$0.baseAddress?.assumingMemoryBound(to: T.self)
}
return [T](UnsafeBufferPointer(start: value, count: self.count / MemoryLayout<T>.stride))
}
}
示例用法
let data = Data(fromArray: [1, 2, 3, 4, 5])
let array = data.toArray(type: Int.self)
print(array)
// [1, 2, 3, 4, 5]
Swift 3 extension
extension Data {
init<T>(fromArray values: [T]) {
var values = values
self.init(buffer: UnsafeBufferPointer(start: &values, count: values.count))
}
func toArray<T>(type: T.Type) -> [T] {
return self.withUnsafeBytes {
[T](UnsafeBufferPointer(start: $0, count: self.count/MemoryLayout<T>.stride))
}
}
}
使用方法
let bytes:[UInt8] = [0x00, 0xf4, 0x7c]
let data = Data(fromArray: someBytes)
print(data as NSData)
let bytes = data.toArray(type: UInt8.self)
print(bytes)
在Swift 5中的答案很简单,但不在这里找到。遇到了这个问题并找到了答案:
var bytes = [Int8](repeating: 0, count: 32)
let data = Data(bytes: bytes, count: bytes.count)
Int
数组而不是一个Byte
数组。 - Nate CookByte
在Swift1.2中已被删除,请使用UInt8
代替。 - mash