Swift(これらはすべてObjective-Cであり、Swiftに存在するとは思わないポインターを処理します)でこの問題の解決策が見つかりませんでした形)。 SwiftでNSData
オブジェクトを[Uint8]
の形式のバイト配列に変換する方法はありますか?
少し複雑な方法でポインターを使用する場合、またはSwift 3で導入された新しいArray
コンストラクターを介して、最初に配列をプレースホルダー値に初期化することを回避できます。
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))
}
Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>(data.bytes), count: data.length))
おもしろいですが、もっと簡単な解決策があります。 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")
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)
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)
Swift 5ソリューション
データ[バイト]
extension Data {
var bytes : [UInt8]{
return [UInt8](self)
}
}
[バイト]からデータ
extension Array where Element == UInt8 {
var data : Data{
return Data(self)
}
}
Swift 3/4
let data = Data(bytes: [0x01, 0x02, 0x03])
let byteArray: [UInt8] = data.map { $0 }
あなたが試すことができます
extension Data {
func toByteArray() -> [UInt8]? {
var byteData = [UInt8](repeating:0, count: self.count)
self.copyBytes(to: &byteData, count: self.count)
return byteData
}
}