ビッグエンディアンマシンからリトルエンディアンマシンにあるデコーダに送られるデータをデコードしようとしています。私はこれを非常にうまく扱っていないし、自分自身を混乱させるような気がする。エンディアン変換C++
ビットセットを使用してデータを印刷するので、特定の32ビット構造に対してどのように出力されているかを正確に把握でき、必要なデータがビットシーケンスの途中にあることがわかります。
ここで、32ビットの値を持っていて、大きな値から小さな値へ行く場合は、バイト順序を逆にすることを知っています。私がそれをすると、私の数字は私が期待しているところで終わることはありません(手で行う)。
たとえば、私は32ビットのunsigned intを持っています。私はそれが私のビッグエンディアンマシンから0x50000000として来ていることを知っています。リトルエンディアンマシンのビットセットを使用してこれを印刷すると、cout << "packSpare 32: " << bitset<32>(Data.pack_Spare).to_string() << endl;
私は0x00005000を取得します。したがって、最初の2バイトを2番目の2バイトと順に入れ替えたように見えます。
私はもともとこのような構造体を持っていた:
それはそう、ビッグエンディアンのマシンから送信されたが、私は起こっビットのいくつかの明白なスワップに関するissureに気づいているかの逆順である#pragma pack(push, 1)
struct PACK_SPARE
{
int Spare3:28;
int Heading_Reference:1;
int Spare2:1;
int H_Valid:1;
int Spare5:1;
};
#pragma pack(pop)
全部を32ビットとして取り込み、スワップしてからデータを印刷したいと思っていました。今すぐ使用していますint pack_Spare;
32ビット値全体をスワップするのではなく、2つの16ビットチャンクを取り込み、それらを交換するだけですか?申し訳ありませんが、これは意味がない場合、私が言ったように、私は混乱しています。
EDIT このデータは、ネットワーク経由で来ていません。私はビデオファイルからビットをストリーミングしています。このデータを対応する値に格納します。私はビットセットを使用する場合、32ビットintの2つの16ビットのグループをバイト単位で交換するのではなく、なぜそれが変数にfreadデータを持っているのですか?私は0x50000000を期待していますが、0x00005000(0000と5000は、すべてのバイトの順序を逆にしていた典型的なエンディアンスワッピングの代わりに、スワップされています)が得られます。
「hton()」または「ntoh()」の中の「network」という単語は、バイトがどこから来たのかを示すのではなく、ビッグエンディアンの「ネットワークバイトオーダー」です。 – Fozi
しかし、私の問題は大きなエンディアンからリトルエンディアンに変換されていませんでした。バイトオーダーを交換することで、あるフォーマットから別のフォーマットに変換するのではなく、16ビットずつスワップしていました。 32は1-16に、1-16は17-32に)。なぜそれがそれをしていたのか分かりませんでした。 – shawleigh17
あなたの問題はプロトコルレベルであると私は信じています。 – Fozi