私は特別な unsigned long (32 ビット) を持っており、そのエンディアンを少しずつ変換する必要があります。私の long は、すべてが 1 つのバイナリにまとめられた複数のものを表します。
どうすればいいのですか?
私は特別な unsigned long (32 ビット) を持っており、そのエンディアンを少しずつ変換する必要があります。私の long は、すべてが 1 つのバイナリにまとめられた複数のものを表します。
どうすればいいのですか?
エンディアンはワード レベルの概念であり、バイトは最上位バイトが最初 (ビッグ エンディアン) または最下位バイトが最初 (リトル エンディアン) に格納されます。ネットワーク経由で転送されるデータは通常、ビッグ エンディアン (いわゆるネットワーク バイト オーダー) です。マシンのメモリに格納されるデータはどちらの順序でもかまいませんが、Intel x86 アーキテクチャが普及していることを考えると、リトル エンディアンが最も一般的です。ほとんどのコンピューター アーキテクチャはビッグ エンディアンですが、x86 はどこにでもあるため、ほとんどの場合、メモリ内にリトル エンディアン データが表示されます。
とにかく、エンディアンはビットレベルではなくバイトレベルでのみ適用される非常に具体的な概念です。、、、およびあなたが望むことをしない場合ntohs()
、あなたが扱っているのはエンディアンそのものではありません。ntohl()
htons()
htonl()
unsigned long の個々のビットを逆にする必要がある場合、またはそのような複雑なことを行う必要がある場合は、正確に何をする必要があるかについての詳細を投稿してください。
「エンディアン」の意味を理解するように注意してください。これは、バイト内のビットではなく、データ内のバイトの順序を指します。d-word を変換するには、htonl や ntohl などの関数を使用するだけでよい場合があります。
本当に 32b データ型のすべてのビットの順序を逆にしたい場合は、反復アルゴリズムを記述して、各ビットをマスクし、適切な反映位置にシフトすることができます。
unsigned 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;
}
整数のビット順序を反転するには、ビットを一方向にシフトアウトし、反対方向にビットを宛先にシフトできます。