質問
特別な符号なしlong(32ビット)があり、ビットのエンディアンをビットごとに変換する必要があります-私のlongは、いくつかのすべてがスムーズに1つのバイナリにまとめられていることを表します。
どうすればいいですか
解決
エンディアンネスは、バイトが最上位バイトを最初に格納する(ビッグエンディアン)か、最下位バイトを最初に格納する(リトルエンディアン)というワードレベルの概念です。ネットワークを介して転送されるデータは通常、ビッグエンディアン(いわゆるネットワークバイトオーダー)です。マシンのメモリに保存されるデータはどちらの順序でもかまいませんが、Intel x86アーキテクチャの普及を考えると、リトルエンディアンが最も一般的です。ほとんどのコンピューターアーキテクチャはビッグエンディアンですが、x86はユビキタスであるため、ほとんどの場合、メモリ内にリトルエンディアンデータが表示されます。
とにかく、すべてのポイントは、エンディアンがビットレベルではなく、バイトレベルでのみ適用される非常に具体的な概念であるということです。 ntohs()
、 ntohl()
、 htons()
、および htonl()
が何もしない場合必要なのは、エンディアンではないことです。
unsigned longの個々のビットを反転する必要がある場合、またはそのような複雑な操作を行う必要がある場合は、正確に必要なことに関する詳細情報を投稿してください。
他のヒント
「エンディアンネス」の意味を理解するように注意してください。バイト内のビットではなく、データ内のバイトの順序を指します。 d-wordを変換するには、htonlやntohlなどの関数を使用するだけで済みます。
32bデータ型のすべてのビットの順序を本当に逆にしたい場合は、反復アルゴリズムを記述して、各ビットをマスクし、適切な反射位置にシフトします。
符号なしlong値の単純なエンディアンネス変換関数は、次のようになります。
typedef union {
unsigned long u32;
unsigned char u8 [ 4 ];
} U32_U8;
unsigned long SwapEndian(unsigned long u)
{
U32_U8 source;
U32_U8 dest;
source.u32 = u;
dest.u8[0] = source.u8[3];
dest.u8[1] = source.u8[2];
dest.u8[2] = source.u8[1];
dest.u8[3] = source.u8[0];
return dest.u32;
}
整数のビット順序を反転するには、ビットを一方向にシフトアウトし、反対方向にビットを宛先にシフトします。