2

私は勤務先のテストプログラムの問題を受け継いだインターン生です。少し調べてみると、まったく同じ問題を抱えている人に出会うことができます。ここで少し聞いてみたところ、これを投稿した人は実際にまだここで働いていることがわかりました。私もこれについて彼の助けを得ていますが、彼は私よりももう少し真剣に問題を説明していると思います。

このフォーラムで

無駄なことをすべて読みたくない人のために、ここにその要点があります。クライアント側で実行され、SPARC Unix マシンで実行される Ada で記述されたテスト アプリケーションへのリモート呼び出しを行う GUI があります。建物内の全員が Unix マシンを使用してすべてを行っていたときは、テスト アプリと GUI は問題なく動作していましたが、最近は全員がより高速な新しい Linux x86 マシンを手に入れました。

テスト アプリと GUI の間にビッグ/リトル エンディアンの非互換性があるため、アップグレードしたユーザーはテスト アプリを実行できません。

さて、それを修正する方法を見つけるのが私の仕事です。さて、ここで大規模なアプリの書き直しが行われることはわかっています。おそらく、GUI とテスト アプリが相互に対話する方法を再定義する必要がありますが、プログラムを完全に逆アセンブルせずにこれを行うにはどうすればよいでしょうか?

私が思いついたいくつかのオプションは次のとおりです。 Java RMI XML/RPC SOAP データの焼き付け?

私はネットワーク プログラミングの初心者であり、これらの「ソリューション」が有効に見えるかもしれませんが、完全にベースから外れている可能性があることを覚えておいてください。助けてください!

4

2 に答える 2

1

何も書き直す必要はありません。両側でネットワーク順序 (ビッグ エンディアン、自然に数値を表現する方法) を使用していることを確認してください。x86 はリトル エンディアンを使用するため、x86 で失敗するアプリケーションのソース コードを確認する必要があります。

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

于 2009-06-16T19:28:05.293 に答える
0

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

実際に行う必要があるのは、一方 (おそらくテスト アプリ) にコードを追加して、受信データでバイト スワッピングを実行することだけです。

もちろん、難しいのは、(一般的に) バイトを交換するだけではできないことです。2 つの 2 バイト整数は、同じアドレスにある 1 つの 4 バイト整数とは異なる方法でスワップする必要があるため、データが何であるかを知る必要があります。文字データはまったく交換されません。

考えられる簡単な解決策: Ada コンパイラとして Gnat を使用している場合、ストリームを使用するようにデータ転送コードを書き直して (まだそのように行っていない場合)、Linux 側で読み取り用の Ada コードを書くという方法があります。ストリームを使用します。次に、 XDRバージョンの Ada ストリームを使用するようにコンパイラを修正します(詳細については、こちらこちらを参照してください。Gnat のストリームの XDR バージョンは、バイト交換を自動的に処理します。

于 2009-06-17T20:27:14.633 に答える