简体   繁体   English

来自 Swift 字节数组的 NSData

[英]NSData from Byte array in Swift

I'm trying to create an NSData var from an array of bytes.我正在尝试从字节数组创建一个NSData var

In Obj-C I might have done this:在 Obj-C 中我可能这样做了:

NSData *endMarker = [[NSData alloc] initWithBytes:{ 0xFF, 0xD9 }, length: 2]

I can't figure out a working equivalent in Swift.我想不出 Swift 中的等效工作。

NSData has an initializer that takes a bytes pointer: init(bytes: UnsafeMutablePointer <Void>, length: Int) . NSData有一个初始化器,它接受一个bytes指针: init(bytes: UnsafeMutablePointer <Void>, length: Int) An UnsafePointer parameter can accept a variety of different things, including a simple Swift array, so you can use pretty much the same syntax as in Objective-C. UnsafePointer参数可以接受各种不同的东西,包括一个简单的Swift数组,因此您可以使用几乎与Objective-C相同的语法。 When you pass the array, you need to make sure you identify it as a UInt8 array or Swift's type inference will assume you mean to create an Int array. 传递数组时,需要确保将其标识为UInt8数组,否则Swift的类型推断将假设您创建一个Int数组。

var endMarker = NSData(bytes: [0xFF, 0xD9] as [UInt8], length: 2)

You can read more about unsafe pointer parameters in Apple's Interacting with C APIs documentation. 您可以在Apple的Interacting with C API文档中阅读有关不安全指针参数的更多信息。

var foo : Byte[] = [0xff, 0xD9]

var data = NSData(bytes: foo, length: foo.count)

println("\(data)")

outputs: ff d9 输出:ff d9

var data = NSData(bytes: [0xFF, 0xD9] as Byte[], length: 2)

println("\(data)")

outputs: ff d9 输出:ff d9

Edit: Ah, you have to write 'as Byte[]', so then the results are the same 编辑:啊,你必须写'as Byte []',那么结果是一样的


UPDATED for Swift 2.2 更新为Swift 2.2

var foo:[UInt8] = [0xff, 0xD9]
var data = NSData(bytes: foo, length: foo.count)
print("\(data)")

outputs: ff d9 输出:ff d9

var data = NSData(bytes: [0xFF, 0xD9] as [UInt8], length: 2)
print("\(data)")

outputs: ff d9 输出:ff d9

You don't need to extend Data, in Swift 3 you can do this: 你不需要扩展数据,在Swift 3中你可以这样做:

let bytes:[UInt8] = [0x00, 0x01, 0x02, 0x03]
let data = Data(bytes: bytes)
print(data as NSData)

Prints "<00010203>" 打印“<00010203>”

To get the byte array again: 要再次获取字节数组:

let byteArray:[UInt8] = [UInt8](data)

Swift 3 extension Swift 3扩展

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

Usage 用法

let bytes:[UInt8] = [0x00, 0xf4, 0x7c]
let data = Data(fromArray: someBytes)
print(data as NSData)

let bytes = data.toArray(type: UInt8.self)
print(bytes)

Answer in Swift 5 is simple and not found here. Swift 5 中的答案很简单,这里找不到。 Ran into this issue and found answer:遇到这个问题并找到答案:

var bytes = [Int8](repeating: 0, count: 32)
let data = Data(bytes: bytes, count: bytes.count)

For Swift 5 I have created another Data extension that works well. 对于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))
    }

}

Sample Usage 样本用法

let data = Data(fromArray: [1, 2, 3, 4, 5])
let array = data.toArray(type: Int.self)
print(array)
// [1, 2, 3, 4, 5]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM