2

現在、回避方法がわからない問題に直面しています。
ビッグ エンディアンまたはリトル エンディアンのデータを処理しようとしています。常にヘッダーで始まるため、これは実際には問題ではありません。使用する必要があるエンディアン モードを確認できますが、値のデコード中に、ビッグ エンディアン データの実装方法がわからない操作がいくつかあります。
コードはリトル エンディアン (またはリトル エンディアン モードで実行) の nVidia Tegra (ARMv7 アーキテクチャに基づく Cortex-A9) で実行されますが、ビッグ エンディアン データを取得することがあります。
データに対するほとんどの操作は実際には問題ではありませんが、追加を正しく行う方法がわかりません..

Example:    D5 1B EE 96    |     96 EE 1B D5
        +   AC 84 F4 D5    | +   D5 F4 84 AC
        = 1 81 A0 E3 6B    | = 1 6C E2 A0 81

ご覧のとおり、ほとんどのバイトは結果で既に正しいですが、一部は正しくありません。加算は常に右から左 (リトル エンディアン マシン) に行われるため、予想される結果とは +1 または -1 だけ異なります。
このリトル エンディアン マシンでのビッグ エンディアンの加算の場合、左から右に加算し、キャリー (ある場合) を右に取る必要があります。

私の質問は、正しい結果を得る可能性があるかどうかです(おそらくプロセッサに特別な命令を使用していますか?)。両方のオペランドと結果を元に戻すよりも「安価な」これらの +1/-1 の違いを取り除くために、結果に対して実行できる操作がさらにあるのではないでしょうか?

よろしく、 トバイアス

4

2 に答える 2

4

これを行う最も論理的な方法は、数値を正しいエンディアンに変換してから計算を実行し、(必要に応じて)再度変換することです。

もちろん、ループを使用してバイトごとの逆方向の計算を行い、キャリーを処理することもできますが、より複雑であり、条件文やプロセッサが多いため、高速化されないことは間違いありません。 「バイトスワッピング」はかなり得意です。

ntohlおよびhtonsネットワーク機能を使用して数値を変換できるはずです。

このようなもの:

int add_big_endian(int a, int b)
{
   x = ntohl(a);
   y = ntohl(b);

   z = x + y;

   return htonl(z);
}
于 2013-01-24T14:39:22.840 に答える
0

2 つのオプションがあります。エンディアンごとに 1 つずつ、2 つのコード セットを記述して、どこで何が起こっているかを追跡するか、単一の内部表現を使用して、入力値と出力値を適切に変換することができます。後者ははるかに簡単です。

于 2013-01-24T14:42:31.710 に答える