データのブロックをメモリに読み込み、以下に示す関数を使用してビッグエンディアンの整数を交換することで、大きなバイナリファイル(〜8Gb)を解析することができました。ただし、 Boost Memory-Mappedファイルを使用してパフォーマンスを向上させようとしていますが、ファイルが読み取り専用モードで開かれているため、endian_swap関数を使用できません。元のファイルを書き込まずにバイトを交換する効率的な方法はありますか?そうでない場合、パフォーマンスはI / Oオーバーヘッドの影響を受けますか?
inline void endian_swap(unsigned short int& x)
{
x = (x>>8) |
(x<<8);
}
inline void endian_swap(unsigned int& x)
{
x = (x>>24) |
((x<<8) & 0x00FF0000) |
((x>>8) & 0x0000FF00) |
(x<<24);
}
inline void endian_swap(unsigned long long int& x)
{
x = (((unsigned long long int)(x) << 56) | \
(((unsigned long long int)(x) << 40) & 0xff000000000000ULL) | \
(((unsigned long long int)(x) << 24) & 0xff0000000000ULL) | \
(((unsigned long long int)(x) << 8) & 0xff00000000ULL) | \
(((unsigned long long int)(x) >> 8) & 0xff000000ULL) | \
(((unsigned long long int)(x) >> 24) & 0xff0000ULL) | \
(((unsigned long long int)(x) >> 40) & 0xff00ULL) | \
((unsigned long long int)(x) >> 56));
}
コードはこの記事で見つかりました。お時間をいただき、誠にありがとうございます。