Program Tip

NSData를 Swift에서 [Uint8]로

programtip 2020. 11. 22. 20:29
반응형

NSData를 Swift에서 [Uint8]로


저는 Swift에서이 문제에 대한 해결책을 찾을 수 없었습니다 (모두 Objective-C이며, Swift에 같은 형태로 존재하지 않는다고 생각하는 포인터를 다룹니다). NSData객체를 [Uint8]Swift 의 형태로 바이트 배열로 변환하는 방법이 있습니까?


약간 복잡한 방식으로 포인터를 통과하거나 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))
}

스위프트 2

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] 선택 사항 ( "TestString")


Swift 5 솔루션

데이터를 [바이트]로

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

[바이트]를 데이터로

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

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)

스위프트 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)

스위프트 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
  }
}

신속한 4 및 이미지 데이터를 바이트 배열로 변환합니다.

 func getArrayOfBytesFromImage(imageData:Data) ->[UInt8]{

    let count = imageData.count / MemoryLayout<UInt8>.size
    var byteArray = [UInt8](repeating: 0, count: count)
    imageData.copyBytes(to: &byteArray, count:count)
    return byteArray

}

참고 URL : https://stackoverflow.com/questions/31821709/nsdata-to-uint8-in-swift

반응형