簡體   English   中英

如何在Swift中獲取任意數組的字節大小?

[英]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()確保數組為其元素使用連續存儲。

對於“簡單”類型(如IntFloat這將提供預期的結果:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM