2017-09-06 14 views
0

"ネットワークバイトオーダー"の概念を理解できません。私はNetwork byte order and endianness issuesを読みましたが、それでもできません。
今、私はTCPソケットを介して2台のコンピュータ間の通信のための正式なネットワークプロトコル記述を作成しました。ここでは「...リトルエンディアンのバイトオーダーを使用する」というフレーズがあります。しかし、標準のネットワークバイトオーダーはビッグエンディアンです。ネットワークバイトオーダーについて考えるべきですか?

ネットワークの両側でバイトオーダーが完全に定義されていて、おおよその文字列がvoid*sizeの場合は、バイトオーダーについて考えるべきですか?ネットワークは自分のデータをどのように「知る」ことができますか?浮動小数点型はどうですか?

stream.setDevice(tcpSocket); 
stream.setByteOrder(QDataStream::LittleEndian); 
... 

struct SomeType 
{ 
    int32_t a; 
    int32_t b; 
    double c; 

    friend QDataStream& operator << (
     QDataStream& stream, const SomeType& x) 
    { 
     stream << x.a 
      << x.b 
      << x.c; 

     return stream; 
    }   
}; 

またはだけであってもよい:

SomeType x; 
tcpSocket.write(&x, size); // If known a byte order and a data structure alignment on both sides 
+2

コンピュータのネットワークまたはネットワークスタックは、送信するデータについて何も知らず、バイナリブロブのシーケンスを前後に渡すだけです。この問題は、あなたのプログラムが扱うことができるものにデータを解釈する必要があるとき*あなたのプログラムにあります。ビッグエンディアンシステムがリトルエンディアンである別のシステムに変更されていない 'int 'を送信した場合、受信者は受け取った' int'値が送信されたもの以外であると考えます。 –

+0

@Someprogrammerdude、私の例ではこれについて考えることはできませんか(バイトオーダーと両方のホスト側のデータ構造の整列が分かっていれば)? –

+1

@VladimirBershovすることはできますが、このミスは問題になります。いずれにしても、圧縮されたフレーミングプロトコルを使用すると、パフォーマンスとメンテナンスのメリットが得られます。 Googleのプロトコルバッファは、自由に利用できるプロトコルの1つです。 –

答えて

2

32ビット値がリトルエンディアンとして表される(インテルなど):私は私の側に書き込むことができないかどうかを例えば

address offset 0 1 2 3 bits 0-7 bits 8-15 bits 16-23 bits 24-31


とネットワークバイト順またはビッグエンディアン(モトローラのCPUなど)で表される:

address offset 0 1 2 3 bits 24-31 bits 16-23 bits 8-15 bits 0-7


あなたが最初の(あなたがやった場合)マシンコードを書くために学んだアーキテクチャに応じて、1つのようになりますあなたには他のものよりも意味があります。 45歳未満のほとんどの人にとって、ネットワークバイトオーダーとは反対のリトルエンディアンになります。 (!)

テキサスの土地で、0ビットので、あなたはそれがさらに混乱だ私のようなテキサスTMS9900アーキテクチャ上のマシンコードを記述することを学んだ場合は最上位ビットである


更新:

一般に、ハードウェアまたはコンパイラの実装の選択、または言語とは独立した方法で、ワイヤ上のデータをエンコードする方が良いです。

ここhttps://developers.google.com/protocol-buffers/docs/encoding

利点がある:

  1. 一般少ないトラフィックがそれほど速く送信

  2. 各端ネットワーキングここ

    は、Googleのプロトコルバッファからそのような符号化の例です接続のハードウェア、コンパイラのバージョンに関係なく、データを理解するか、またはさらに言語。

+0

しかし、私の場合はどうでしょうか?両方のホスト側でバイトオーダーとデータ構造の整列がわかっていれば(そして明確に定義されていれば)どうですか? –

+0

@VladimirBershovこれはあなたのコードを1つの特定のハードウェアに結びつけます。ハードウェアは時間とともに変化します。あなたのコードは10年後でも動作しますか? –

+0

しかし、 'int'を' int32_t'に変更したら?とにかく、浮動小数点値の解決策はありません –

1

TCPソケットは単なるバイトストリームであり、送信するデータのエンディアンについてはまったく気にしません。したがって、自分のプライベートネットワークプロトコルでは、好きなバイトオーダーを使用することができます。プロトコルを使用するすべてのコンピュータが同じ自然なバイトオーダーを持っている場合は、これを直列化順序として使用することをお勧めします。これは、2番目の例のようにコードを書くことができるためです。

関連する問題