2016-06-14 12 views
-3

入力として.xmlファイルから直径を作成するUnixコードがありました。 私たちはLinuxプラットフォームに移行したので、同じユーティリティを作成する必要があります。コードは正常にコンパイルされましたが、ユーティリティは出力ファイルの内容を作成しません。出力ファイルに書き込まれるUnixのコード(ビッグエンディアン)とlinux(リトルエンディアン)の同じコードは、異なる出力直径のファイルを作成します。

メッセージブロックは、フォーマットは次のとおりです。

ACE_Message_Block* mb = m_pReqMsgBlock; 
while (mb) { 
       out.write(mb->rd_ptr(), mb->size()); 
       mb = mb->cont(); 
      } 

誰でもバイトが期待される方法で書き込むことができるように、余分なコードを追加することができるものをお勧めすることはできますか?

+5

"Linuxはリトルエンディアンです" - いいえ、あなたのマシンです!あなたのコードがデータの特定の表現に依存している場合、それはちょうどひどく書かれています。ビットシフトを使用して適切なシリアル化を行い、実装固有の動作に決して依存しないでください。 – Olaf

+0

各ビットを逆にすると役立つかどうか試してみてください。 http://stackoverflow.com/questions/2602823/in-c-c-whats-the-simplest-way-to-reverse-the-order-of-bits-in-a-byte。これは、エンディアンが異なるシステムにファイルを転送する場合にのみ行うべきであることに注意してください。 –

+1

これまでのプラットフォームは何でしたか?実際の出力と期待される出力を指定してください。 –

答えて

5

ビッグエンディアン形式からリトルエンディアン形式に変換する必要があります。これは、構造内の16ビットと32ビットの値に対して個別に行わなければなりません。

htonshtonlのような機能は、それぞれ16ビットと32ビットの整数を変換するために使用できます。

数値が変換されると、write関数を使用して書き込むことができます。

+0

私はすでにこれを試みましたが、書き込まれるデータは整数ではなく、ACEクラスACEクラスを使用している外部ライブラリからです。ACE_Message_Block –

+0

ACE_Message_Blockの構造要素を見て、上記のように。ビッグエンディアンとリトルエンディアンでは8ビットの値が同じであることに注意してください。 –

0

バイナリデータをファイルに書き込む場合、そのバイナリデータの「正しい」エンディアンはマシン固有です。したがって、このデータが別のエンディアンのマシンで実行されている場合、このデータが異なることは正しいです。このバイナリデータを同じLinuxマシン上の別のプログラムと再度解析すると、リトルエンディアンになると予想されます。

出力をエンディアンにしたくない場合(たとえば、データを読み取るプログラムがビッグエンディアンのUNIXマシンにあるため)、バイナリデータを出力しないでください。

関連する問題