最も高速ではありませんが、移植性のある方法は、ファイルを(符号なし)int配列に読み込み、int配列をchar 1(厳密なエイリアシング規則で許されます)にエイリアスし、メモリ内のバイトをスワップします。
完全にポータブルな方法:
swapints(unsigned int *arr, size_t l) {
unsigned int cur;
char *ix;
for (size_t i=0; i<l; i++) {
int cur;
char *dest = static_cast<char *>(&cur) + sizeof(int);
char *src = static_cast<char *>(&(arr[i]));
for(int j=0; j<sizeof(int); j++) *(--dest) = *(src++);
arr[i] = cur;
}
}
しかし、あなたが移植を必要としない場合は、一部のシステムでは、スワップ機能を提供します。例えば、BSDシステムはuint16_t
、およびuint_64_t
にそれぞれバイトをスワップするためにbswap16
,bswap32
およびbswap64
を持っています。 MicrosoftやGNU-Linuxの世界には同等の機能が存在することは間違いありません。あなたは、ファイルがネットワーク順(ビッグエンディアン)であり、あなたのプロセッサではないことがわかっている場合
あるいは、あなたはそれぞれuint16_t
とuint32_t
ためntohs
とntohl
機能を使用することができます。 (AndrewHenleさんのコメントあたり)
備考:どんなホストエンディアン、ntohs
とntohl
常に使用することができます - あなたがしている(I)以来、単に彼らはビッグエンディアンのシステム
には-OPSではない、私はアセンブリのインライン化を訴えますとにかくその時点でプラットフォーム特有のものであり、(ii)明確に定義されたC++で問題を解決することは困難です。 – Bathsheba
ファイルフォーマット指定のバイトオーダーを作成します。あなたがファイルを作成した人に関係なく、ファイルのバイト順を知ることができます。一般的な選択は、ネットワークバイトオーダー(ビッグエンディアン)のためです。ファイルを操作するには、['htonl'](http:// pubs。opengroup.org/onlinepubs/9699919799/functions/htonl.html)ファミリのファンクションを使用して、ホストバイトオーダー(そのいずれか)とネットワークバイトオーダーの間で変換します。 –
@Bathsheba - 真実ではない。 Intrinsicsはインラインasmコードの痛みに対処することなく移植性を実現する方法です。 Linux/GCCの場合は__builtin_bswap32と__builtin_bswap64を試してください。 Microsoftにも同様のものがあります。 – BitBank