バイナリファイルに保存されている数値を読み取る最速の方法を探しています。
動作しているように見えるいくつかの機能を実行しましたが、実装が適切かどうかについてフィードバックを受け取りたいと思います。
4バイトのリトルエンディアンブロックから符号付き整数を取得する方法は次のとおりです。
signed long int from4li(char const * const buffer)
{
signed long int value = 0;
value += (unsigned char) buffer[3];
value <<= 8;
value += (unsigned char) buffer[2];
value <<= 8;
value += (unsigned char) buffer[1];
value <<= 8;
value += (unsigned char) buffer[0];
return value;
}
これは符号なし整数でも機能しますが、私は元々、符号なし整数に対して別の実装を作成しました(符号付き整数では失敗します。理由は正確にはわかりません)。
unsigned long int fromu4li(char const * const buffer)
{
unsigned long int value = 0;
value += (unsigned char) buffer[0] << 8 * 0;
value += (unsigned char) buffer[1] << 8 * 1;
value += (unsigned char) buffer[2] << 8 * 2;
value += (unsigned char) buffer[3] << 8 * 3;
return value;
}
整数からリトルエンディアンの文字列バッファへの変換については、おそらくこれ以上最適化できなかったと思います。
void to4li(long int const value, char * const buffer)
{
buffer[0] = value >> 8 * 0;
buffer[1] = value >> 8 * 1;
buffer[2] = value >> 8 * 2;
buffer[3] = value >> 8 * 3;
}
memcpyを使用するとさらに高速になる可能性もあると思いますが、memcpyを使用するには、ホストシステムのエンディアンを知る必要があります。
私のコードはホストシステムの内部データ表現から独立している必要があると思うので、ホストシステムのエンディアンに依存したくありません。
それで、これはそれらの変換を行う適切な方法ですか、それとも関数を改善できますか?