クロスプラットフォームのデータ型を提供するためのC(C ++、Boostなどではない)ライブラリはありますか?
詳述するint
と、32ビットのLinuxマシンのファイルにファイルを保存しint
、64ビットのWindowsマシンからファイルを読み取ります。これは可能ですか?
更新:sqliteやある種のデータベースも使いたくありません。コード全体でデータ型を使用するのに役立つライブラリが必要です。
クロスプラットフォームのデータ型を提供するためのC(C ++、Boostなどではない)ライブラリはありますか?
詳述するint
と、32ビットのLinuxマシンのファイルにファイルを保存しint
、64ビットのWindowsマシンからファイルを読み取ります。これは可能ですか?
更新:sqliteやある種のデータベースも使いたくありません。コード全体でデータ型を使用するのに役立つライブラリが必要です。
32ビットの符号付き整数を格納するだけの場合は、ビッグエンディアンなどの形式を決定するだけです。次に、シリアル化/逆シリアル化を自分で作成できます。
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などを使用してください。
コンパイラがC99標準について知っている場合は、int32_tを使用できます。
http://en.wikipedia.org/wiki/C_data_types#Fixed_width_integer_types 私見あなたのOSは同じエンディアンを持っているべきです。x86およびx86_64上のWindowsとLinuxはどちらもリトルエンディアンであるため、機能するはずです。 http://en.wikipedia.org/wiki/Endianness#Endianness_and_operating_systems_on_architectures