2012-07-28 46 views
0

是否存在用於提供跨平臺數據類型的C(而不是C++,Boost等)庫?用於跨平臺數據類型的庫C

詳細說明,我想將一個int存儲在32位Linux機器的文件中,從64位Windows機器讀取文件和相同的int。這可能嗎 ?

更新:我不想使用sqlite或某種數據庫。我想要一個能夠幫助我在整個代碼中使用數據類型的庫。

+2

你需要先選擇你的毒藥--ASN.1,xml,然後找到一個支持它的庫。 – Duck 2012-07-28 19:34:45

+2

你可能想要一個序列化庫。 XDR存在多年。還有很多其他的選擇。 – 2012-07-28 19:45:07

+0

這是關於便攜式二進制序列化。 – AraK 2012-07-28 19:45:12

回答

5

如果你想要做的只是存儲32位有符號整數,就決定一個格式,例如big endian。然後,您可以編寫序列/ deserialisation自己:

void write_int32_be (int32_t i, FILE *f) 
{ 
    uint8_t buf[4]; 

    buf[0] = ((uint32_t)i >> 24); 
    buf[1] = ((uint32_t)i >> 16) & 0xFF; 
    buf[2] = ((uint32_t)i >> 8) & 0xFF; 
    buf[3] = (uint32_t)i & 0xFF; 
    fwrite (buf, 4, 1, f); 
} 

int32_t read_int32_be (FILE *f) 
{ 
    uint8_t buf[4]; 

    fread (buf, 4, 1, f); 

    return ((uint32_t)buf[0] << 24) | 
     ((uint32_t)buf[1] << 16) | 
     ((uint32_t)buf[2] << 8) | 
      (uint32_t)buf[3]; 
} 

如果您需要多種類型,使用圖書館像tplEetAvroprotobuf-c或類似XDR一個標準的實現,JSON,或ASN.1。如果您有大量的數字數據集,請使用HDFNetCDF之類的東西。

3

如果你的編譯器(S)瞭解C99的標準,那麼你可以只使用int32_t

http://en.wikipedia.org/wiki/C_data_types#Fixed_width_integer_types 恕我直言,你的操作系統應該具有相同的字節順序。 x86和x86_64上的Windows和Linux都是小端,所以它應該可以工作。 http://en.wikipedia.org/wiki/Endianness#Endianness_and_operating_systems_on_architectures

+0

請注意,使用這些固定寬度類型的計算可能比架構的「本機類型」慢。所以如果速度是你的優先考慮,你可能會考慮使用它們來讀取和寫入文件,而在實際代碼中將它們轉換爲int_fast32_t。 – Met 2012-07-28 20:07:28

+2

固定寬度類型將*爲本地類型,否則它們將丟失。 – 2012-07-29 13:18:48