web-dev-qa-db-ja.com

Swiftの[Uint8]へのNSData

Swift(これらはすべてObjective-Cであり、Swiftに存在するとは思わないポインターを処理します)でこの問題の解決策が見つかりませんでした形)。 SwiftでNSDataオブジェクトを[Uint8]の形式のバイト配列に変換する方法はありますか?

59
Bowen Su

少し複雑な方法でポインターを使用する場合、またはSwift 3で導入された新しいArrayコンストラクターを介して、最初に配列をプレースホルダー値に初期化することを回避できます。

スイフト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))
}

スイフト2

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

おもしろいですが、もっと簡単な解決策があります。 Swift 3.で動作します。今日はこれを使用しました。

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

それで全部です! :) NSDataはデータに簡単にブリッジされます。

更新:(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] Optional( "TestString")

38
sVd

getBytesNSData関数を使用して、同等のバイト配列を取得できます。

ソースコードを提供しなかったため、NSDataに変換されたSwift St​​ringコンテンツを使用します。

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)

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

Swift 5ソリューション

データ[バイト]

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

[バイト]からデータ

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

Swift 3/4

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

あなたが試すことができます

extension Data {
func toByteArray() -> [UInt8]? {
    var byteData = [UInt8](repeating:0, count: self.count)
    self.copyBytes(to: &byteData, count: self.count)
    return byteData
  }
}
0
Rachit Agarwal