2017-03-06 100 views
3

我想將某些基本類型編碼/解碼爲二進制文件/從二進制文件解碼。在C++中對二進制對象進行編碼/解碼的標準方法

測試代碼可能如下所示。

int main() 
{ 
    int iter = 0; 
    char* binary = new char[100]; 

    int32_t version = 1; 
    memcpy(binary, &version, sizeof(int32_t)); 
    iter+=sizeof(int32_t); 

    const char* value1 = "myvalue"; 
    memcpy(binary+iter, value1, strlen(value1)); 
    iter+=strlen(value1); 

    double value2 = 0.1; 
    memcpy(binary+iter, &value2, sizeof(double)); 
#warning TODO - big/small endian - fixed type length 

    return 0; 
} 

但是我仍然需要解決很多問題,比如endian和fixed類型的長度。

所以我想知道是否有一個標準的方式來實現這一點。

同時,我不想使用任何第三方實現,例如Boost等。因爲我需要保持我的代碼簡單和獨立。

如果在Objc中有一個像NSCoding這樣的功能/類,它將是最好的。我想知道在C++標準庫中是否有相同的東西。

+3

一個標準的方式不存在這樣的高級功能,重塑車輪看起來不像一個好的設計恕我直言,只是堅持到許多圖書館之一來管理這個[flatbuffers](https: //google.github.io/flatbuffers/)或[protobuf](https://developers.google.com/protocol-buffers/) – Jack

+0

如果您注意類似於C++的內容,則無法在C++中保持簡單且獨立的代碼endian,類型長度,填充等。 – Zefick

+0

我會建議使用FlatBuffers庫。它將生成跨平臺代碼,用於從廣泛範圍爲任何您想要的語言進行序列化/反序列化數據。 – Zefick

回答

1

在每個操作系統基本庫中,最標準的東西是ntohs/ntohl和htons/htonl,您可以使用它們從「主機」到「網絡」字節順序,這被認爲是序列化整數的標準。

問題是,目前還沒有一個64位類型的標準API,您應該自己序列化字符串(最常用的方法是將字符串數據預先包含字符串長度(以字節爲單位)的int16/32)。

再一次,C/C++沒有提供將數據序列化到二進制緩衝區或XML或JSON的標準方法,但是有大量的庫實現了這一點,例如,最常用的如果它帶有很大的依賴性是:

Boost serialize

其他庫廣泛使用,但需要一個預編譯的步驟是:

Google procol buffers

FlatBuffers

3

不,標準庫中沒有序列化函數。使用庫或者自己實現它。

請注意,原始的new和delete在C++中是不好的做法。

+0

你的意思是'原始的新的和刪除在C++中是不好的做法'? – Aeonos

+0

@Aeonos例如,OP忘了刪除... –

+0

@Bob__這是非常快速的代碼,以顯示我的意思只是。我不會在我的項目中編寫這種代碼。通常,我會使用'std :: shared_ptr'。 –

相關問題