Swift中Byte数组的NSData

Jef*_*eff 32 ios swift

我正在尝试NSData var从一个字节数组创建一个.

在Obj-C中我可能会这样做:

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

我无法弄清楚Swift中的工作等价物.

Nat*_*ook 65

NSData有一个带bytes指针的初始化器:init(bytes: UnsafeMutablePointer <Void>, length: Int).一个UnsafePointer参数可以接受多种不同的东西,包括一个简单的斯威夫特阵列,所以你可以使用几乎相同的语法在Objective-C.传递数组时,需要确保将其标识为UInt8数组,否则Swift的类型推断将假定您创建Int数组.

var endMarker = NSData(bytes: [0xFF, 0xD9] as [UInt8], length: 2)
Run Code Online (Sandbox Code Playgroud)

您可以在Apple的Interacting with C API文档中阅读有关不安全指针参数的更多信息.

  • 向数组添加了类型信息 - 它发送了一个`Int`数组而不是`Byte`数组. (2认同)

jun*_*eri 18

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

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

println("\(data)")
Run Code Online (Sandbox Code Playgroud)

输出:ff d9

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

println("\(data)")
Run Code Online (Sandbox Code Playgroud)

输出:ff d9

编辑:啊,你必须写'as Byte []',那么结果是一样的


更新为Swift 2.2

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

输出:ff d9

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

输出:ff d9

  • 看起来你不能在Swift 1.2中使用`Byte`了.而不是`Byte []`,写`[Uint8]` (2认同)

vtc*_*nes 16

你不需要扩展数据,在Swift 3中你可以这样做:

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

打印"<00010203>"

要再次获取字节数组:

let byteArray:[UInt8] = [UInt8](data)
Run Code Online (Sandbox Code Playgroud)


abd*_*lek 8

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

}
Run Code Online (Sandbox Code Playgroud)

使用示例

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


小智 6

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))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

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

let bytes = data.toArray(type: UInt8.self)
print(bytes)
Run Code Online (Sandbox Code Playgroud)