2017-09-11 7 views
1

これはちょっと変わった質問かもしれませんが、別のプログラムと通信するプログラムを作成しました。私は他のプログラムに「距離」を送る必要がありますが、プログラムがこれらの距離をどのように解釈しているのかを理解することができません。特定の形式に変換する際のトラブルC#

私はプログラムに距離をうまく送るデバイスを傍受しました。以下は、送信される距離の例です。私は、このプログラムが距離をとってushortとして読んでいると思う。私の距離を同じフォーマットに変換できないように見えないので、私が行方不明になっていることは間違いないでしょう。

例: 送信される距離は74です。送信されるバイトは[0、74]です。これは私のように18944です。

私の最初の考えは距離がushortに変換されたことです。その後、ushortのバイトがプログラムに送られます。しかし、これはそうではないようです。

+0

まず、あなたの質問は役に立ちない奇妙なまたは愚かかもしれない複数回を述べます。愚かな質問はありません。しかし、ここで質問をする前に研究をしなければならないし、これまで見てきたコードを見せて、それを見て何らかの誤りが見えるようにしなければならない。 [ask]を見てください。 –

+1

デバイスがビッグエンディアンではなく、リトルエンディアンを望んでいるように見えます。 –

+1

「74 * 256 + 0 = 18944」; 'Little/Big'' Endian' –

答えて

3

それは、エラーの原因であるEndiannessです:

  • 送信者:74 (int16) == [0, 74] - 第一高、そして低バイト
  • レシーバ:74 (int16) == [74, 0] - 最初のロー、そしてハイバイト

そして、その理由は受信者が取得する理由です

0 + 74 * 256 == 18944 

チェックを試してくださいリトル/ビッグエンディアン(すなわち、 オーダーバイトの):すべての

byte[] data = new byte[] { 0, 74 }; 

    // If the WorkStation uses Little Endian order, we have to reverse the buffer 
    ushort dist = BitConverter.ToUInt16(BitConverter.IsLittleEndian 
     ? data.Reverse().ToArray() 
     : data, 
    0); 

    // 74 
    Console.WriteLine(dist); 
+0

ありがとうございますこれは非常に役立っています!私は答えを受け入れました –

+0

私のプログラムはC#で書かれており、デフォルトではビッグエンディアンのようです。他のプログラムはC言語で書かれていますが、デフォルトではリトルエンディアンかどうか知っていますか? –

+0

@Lucy Copp:エンディアンはCPUアーキテクチャに依存します(例えば、Intel x86とx86-64はLittle Endianを使用します)。一部のCPU(ARM、Sparcなど)では、必要なエンディアンを選択できます。 –

関連する問題