0

私のリトルエンディアンのz80風のプロセッサには、32ビットlong int msk = 0xFFFFFF00(サブネットマスク)があります。今朝、この値をウォークスルーしてデータベースに保存する関数に渡し(unsigned char *)&mskて みたときに、エンディアンについて学びまし た。void bar(unsigned char * c);&msk

残念ながら、z80プロセッサのリトルエンディアンのため、データベースは値を「逆方向」に格納し、別の関数がバイトを読み戻すと0x00FFFFFF、正しいサブネットマスクではないを認識します。

組合でこれを回避する簡単な方法はありますか?現在のLSBではなく、char[3]のLSBにマップしたいと思います( LSBを取得します)。long int mskchar[0]

結論として、ビッグエンディアンの方が優れています。

4

2 に答える 2

2

エンディアンの問題を修正するには:整数をディスクまたはネットワークにシリアル化するときは常に、既知のバイト順序に変換します。htonlおよびhtons関数がすでに存在するため、ネットワーク順序(別名ビッグエンディアン)が最も簡単です。byte & 0xFF; byte >>= 8または、で下位バイトまたはを使用して上位バイトを繰り返しプルすることにより、手動で行うこともできます。((byte >> i*8) & 0xFF)

値があり、そのLSBが必要な場合long intは、ユニオンやキャストではなく、ビットシフトおよびマスク操作を使用する方がはるかに移植性が高くなります。

于 2012-10-26T18:30:44.377 に答える
1

ntohl32ビット整数のエンディアンを交換します

于 2012-10-26T18:36:38.957 に答える