NSData到Swift中的[Uint8]

Bow*_* Su 65 nsdata swift

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

Ark*_*kku 106

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

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

斯威夫特2

Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>(data.bytes), count: data.length))
Run Code Online (Sandbox Code Playgroud)

  • @califrench对不起,我没有跟进.1)我没有看到`NSArray`,`bytes`访问器没有返回它.2)它会导致什么样的错误?如果您指的是可能不可用的`NS*`类,请回想一下该问题指定`NSData`. (2认同)

sVd*_*sVd 42

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

data: Data // as function parameter    
let byteArray = [UInt8](data)
Run Code Online (Sandbox Code Playgroud)

就这样!:) 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))
Run Code Online (Sandbox Code Playgroud)

输出: [84,101,115,116,83,116,114,105,110,103]可选("TestString")


Mao*_*aor 24

Swift 3+解决方案

数据到[字节]

extension Data {
    var bytes : [UInt8]{
        return [UInt8](self)
    }
}
Run Code Online (Sandbox Code Playgroud)

[字节]到数据

extension Array where Element == UInt8 {
    var data : Data{
        return Data(self)
    }
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*lla 21

您可以使用getBytes函数NSData来获取等效的字节数组.

由于您没有提供任何源代码,我将使用已转换为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)
Run Code Online (Sandbox Code Playgroud)

斯威夫特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)
Run Code Online (Sandbox Code Playgroud)

  • 对于swift 3,用MemoryLayout <UInt8> .size替换sizeof(UInt8) (3认同)

小智 7

迅捷 3/4

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