NSData를 Swift에서 [Uint8]로
저는 Swift에서이 문제에 대한 해결책을 찾을 수 없었습니다 (모두 Objective-C이며, Swift에 같은 형태로 존재하지 않는다고 생각하는 포인터를 다룹니다). NSData
객체를 [Uint8]
Swift 의 형태로 바이트 배열로 변환하는 방법이 있습니까?
약간 복잡한 방식으로 포인터를 통과하거나 Array
Swift 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
'Program Tip' 카테고리의 다른 글
해결되지 않은 외부 기호 "public : virtual struct QMetaObject const * __thiscall Parent (0) | 2020.11.22 |
---|---|
런타임에서 제약 조건 우선 순위를 어떻게 변경할 수 있습니까? (0) | 2020.11.22 |
HTML 페이지를 AJAX를 통해 검색된 내용으로 교체 (0) | 2020.11.22 |
클래스에서 모든 변수 값 인쇄 (0) | 2020.11.22 |
목록 요소에서 \ n을 제거하는 방법은 무엇입니까? (0) | 2020.11.22 |