簡體   English   中英

編碼/解碼 C 帶有不可編碼組件的結構

[英]Encoding/decoding C Struct with components that are not encodable

我在 C header 中定義了一個結構,例如:

struct ComputeParameters {
    float scale;
    vector_float4 rgba;
}

它必須在 C 中定義,而不是在 Swift 中定義,所以我不能只添加編碼協議。

我需要能夠存儲和恢復結構實例的內容——最好是從 Swift 開始,但如果需要,我可以制作 Objective-C class 來對其進行編碼。

我嘗試用 Obj-c 對其進行編碼:

NSValue *structValue = [NSValue value:&computeParams withObjCType:@encode(struct ComputeParameters)];

但我得到這個錯誤:

“struct ComputeParameters”類型的編碼不完整,因為“vector_float4”(又名“simd_float4”)組件的編碼未知

除了編碼結構的每個組件(大約有 3 打組件)之外,還有更好的方法嗎?

您可以訪問結構的實際字節,然后將這些字節轉換為NSData ,但這最終會變得非常低級並且依賴於機器。 這是您選擇的一個極端,只要您具有相同的底層機器架構,它就可以正常工作。 然后,您也可以在 C 中編寫整個實現,並且根本不使用NSData/NSCoding

如果您使用NSCoding ,那么它有自己的一組限制,您需要使用它給您的東西。 有一些方便的低級函數,例如encodeInt64 ,但您最終仍然使用結構的各個成員。 這是您為每個結構編碼單個結構成員的另一個極端。

If you use Objective-C the middle ground can be to create a class for each struct along with code to get a struct from the class and to init a class from a struct. 然后您需要代碼來編碼/解碼每個 class。 這可能需要做很多工作,但如果它很好地集成到您的解決方案中,我認為這是更好/更易於維護的選擇。

最直接的方法是使用低級NSCoding函數,但您仍然最終將每個結構成員映射到一些低級 function 但至少沒有 class 來促進編碼。 然后,您可以例如為每個結構創建一個標識符,並在您解碼時使用它來了解您需要創建和解碼的結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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