2009-06-16 18 views
2

私は働いている場所でテストプログラムの問題を継承したインターンです。私はまったく同じ問題を抱えている人を少しでも探し回ることができます。ここでちょっと尋ねた後、私はこの記事を投稿した人が実際にここで働いていることを知りました。私も彼の助けを借りていますが、私は彼が私よりも少し賢明に問題を説明していると思います。Java/AdaビッグエンディアンからLinuxへLittle Endianの問題

on this forum

ここですべてがゴミを読みたくないあなたの人々のために、それのJISTです。私たちにはクライアント側で実行されるGUIがあり、SPARC Unixマシン上で動作するAdaで書かれたテストアプリケーションへのリモート呼び出しを行います。ビル内の誰もがUnixマシンを使ってすべてのことをやった時、テストアプリとGUIはうまくいっていましたが、最近は誰もが新しいx86 x86マシンを手に入れました。

アップグレード版を入手したユーザーは、テストアプリとGUIの間にBig/Little Endianの互換性がないため、テストアプリを実行できません。

今、それを修正する方法を理解するのは私の仕事です。さて、大きなアプリがここに書き直されることは知っていますし、GUIとテストアプリがどう対話するかを再定義する必要がありますが、プログラムを完全に逆アセンブルしないとどうすればいいですか?次のように

私は自分自身を思い付いたオプションのいくつかは以下のとおりです。 のJava RMI XML/RPC SOAP データベーキング?

私はネットワークプログラミングの全般的な悩みを覚えていますが、これらの「解決策」は私には見えるかもしれませんが、私は完全に基盤を離れているかもしれません。助けてください!

+0

エンディアンが実際問題であることをどのように確認しましたか? – Eddie

+0

@Eddie - 私は実際にそれ自身をまだ検証していません。私はプログラムに取り組んだ最後の男の言葉に行きます。私は彼らは人々がそれに取り組むようになっていると思うが、他のプロジェクトのために引き寄せている。 –

+0

@Eddie:*問題*ではない場合は、certianly * a *問題です。これらの2つのシステムは異なるエンディアンを持っていました。あなたがそれらの間でデータを送信し、それを考慮しない場合、バイトオーダー*は間違っています。 –

答えて

1

何も書き換える必要はありません。両方の側でネットワークオーダー(ビッグエンディアン、自然に数字を表現する方法)を使用するようにしてください。 x86はリトルエンディアンを使用するため、x86上で動作しないアプリケーションのソースコードを参照する必要があります。

次に、htonl/htons/ntohl/ntohs(man 3 htonlを参照)または同様の関数を呼び出して、送受信するすべての数値を、データを送受信するコードの部分で正しいエンコーディングに変換します。 Javaは常にネットワークオーダーを使用するので、ネイティブJavaコードを心配する必要はありません。

+0

答えをありがとう!残念ながら、私は今、もっと混乱しています。 JavaはLEマシン上で実行されており、AdaコードはBEマシン上で実行されているので、すべてがうまくいくはずです。 図面ボードに戻ってみてください。 –

+2

@Andy JavaコードでJNIを使​​用していますか?あなたはエンディアンが問題であると確信していますか?もしそうなら、ワイヤ上でどのようなエンディアンが使用されているかを教えてください。私のアドバイス:両サイドでwiresharkとデバッガを使い、GUIとサーバのネットワークコンポーネントに精通している人に尋ねてください。 – phihag

+0

@phihag JNIは使用されていないと確信しています.100%のエンディアンが問題ではないと思います。私は最後の男からこの問題を学びました。提案していただきありがとうございます。私は間違いなくそれを設定し、私が把握できるものを見てみるつもりです。 –

0

あなたは本当に重い解決策を見ています。 (FYI:別の同様の重い解決策はASN.1です)。

あなたが本当にやる必要があるのは、片面(おそらくテストアプリ)にコードを追加して、付属のデータをバイトスワップするだけです。

もちろん、面倒なことは、(一般的に)バイトをスワップできないことです。 2つの2バイト整数は、同じアドレスの単一の4バイト整数とは異なる方法でスワップする必要があるため、を知る必要があります。はデータです。キャラクタデータは全くスワップされません。

可能な簡単な解決策: あなたはエイダのコンパイラとしてブヨを使用している場合は、1つのオプション(それはすでにそのように行われていない場合)、ストリームを使用して、データの伝送コードを書き換えることであろう、書き込みストリームを使って読むために、Linuxの最後のAdaコードを読んでください。コンパイラを修正して、XDRバージョンのAdaストリームを使用してください(詳細はherehereで説明されています)。GnatのストリームのXDRバージョンは自動的にバイトスワップを処理します。

関連する問題