是否存在用於提供跨平臺數據類型的C(而不是C++,Boost等)庫?用於跨平臺數據類型的庫C
詳細說明,我想將一個int
存儲在32位Linux機器的文件中,從64位Windows機器讀取文件和相同的int
。這可能嗎 ?
更新:我不想使用sqlite或某種數據庫。我想要一個能夠幫助我在整個代碼中使用數據類型的庫。
是否存在用於提供跨平臺數據類型的C(而不是C++,Boost等)庫?用於跨平臺數據類型的庫C
詳細說明,我想將一個int
存儲在32位Linux機器的文件中,從64位Windows機器讀取文件和相同的int
。這可能嗎 ?
更新:我不想使用sqlite或某種數據庫。我想要一個能夠幫助我在整個代碼中使用數據類型的庫。
如果你想要做的只是存儲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];
}
如果您需要多種類型,使用圖書館像tpl,Eet,Avro,protobuf-c或類似XDR一個標準的實現,JSON,或ASN.1。如果您有大量的數字數據集,請使用HDF或NetCDF之類的東西。
如果你的編譯器(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
請注意,使用這些固定寬度類型的計算可能比架構的「本機類型」慢。所以如果速度是你的優先考慮,你可能會考慮使用它們來讀取和寫入文件,而在實際代碼中將它們轉換爲int_fast32_t。 – Met 2012-07-28 20:07:28
固定寬度類型將*爲本地類型,否則它們將丟失。 – 2012-07-29 13:18:48
你需要先選擇你的毒藥--ASN.1,xml,然後找到一個支持它的庫。 – Duck 2012-07-28 19:34:45
你可能想要一個序列化庫。 XDR存在多年。還有很多其他的選擇。 – 2012-07-28 19:45:07
這是關於便攜式二進制序列化。 – AraK 2012-07-28 19:45:12