[英]How to get bytes size for arbitrary array in Swift?
我想使用let rawDataFromArray = NSData(bytes: myArray, length: ???)
,但不知道如何獲取數組的字節長度。 這是我的數組可能是的一些示例:
let arr1 = [1, 2, 3]
let arr2 = [1.0, 23556789000.0]
let arr3 = ["hello", "ok", "👍"]
func arrayLength(myArray: Array) -> Int {
var bytes = 0
for object in myArray {
// not sure what to do here
}
return bytes
}
我不確定是否遍歷數組的每個元素(以及字符串遍歷每個字符的情況,因為表情符號可以有更多的字節表示它們)是執行此操作的正確方法。
如何獲取數組的字節大小?
誰能告訴我正確的方法嗎?
也許只是在Swift中將Array
轉換為NSData
不是一個好習慣?
我也看到過將Swift數組轉換為NSData以進行持久存儲,以及將字節數組轉換為NSData以及將Custom Array轉換為NSData ,但是無法弄清楚如何獲取此類任意數組的字節大小。
似乎有一種誤解:對於每種類型T
,的所有實例T
具有可以被計算為相同的大小sizeof(T)
對於數組,數組元素之間可以有填充 ,因此arr1
所需的總大小為
arr1.count * strideof(Int)
(例如,比較Swift:如何使用sizeof?以解決sizeof()
和strideof()
之間的細微差別)。
因此,從數組創建NSData
的通用函數將是
extension Array {
func asData() -> NSData {
return self.withUnsafeBufferPointer({
NSData(bytes: $0.baseAddress, length: count * strideof(Element))
})
}
}
與withUnsafeBufferPointer()
使用withUnsafeBufferPointer()
確保數組為其元素使用連續存儲。
對於“簡單”類型(如Int
和Float
這將提供預期的結果:
let arr1 = [1, 2, 3]
print(arr1.asData())
// <01000000 00000000 02000000 00000000 03000000 00000000>
let arr2 = [1.0, 23556789000.0]
print(arr2.asData())
// <00000000 0000f03f 0000204c 60f01542>
但是,它對字符串數組沒有用:
let arr3 = ["hello", "ok", "👍"]
print(arr3.asData())
// <945b2900 01000000 05000000 00000000 00000000 00000000 9a5b2900 01000000 02000000 00000000 00000000 00000000 068d2900 01000000 02000000 00000080 00000000 00000000>
因為struct String
包含(隱藏/未記錄的)指向實際字符存儲的指針。
一種可能性是將每個字符串附加為NUL終止的UTF-8字符串:
let data3 = NSMutableData()
arr3.forEach { string in
string.withCString {
data3.appendBytes($0, length: Int(strlen($0)) + 1)
}
}
print(data3)
// <68656c6c 6f006f6b 00f09f91 8d00>
或者,在您引用的線程中使用NSKeyedArchiver
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.