0

これは、数週間前の私自身の質問とほぼ同じです。

データ型が完全な数値を保持できない場合は、16進数を10進数に変換します

今回はその逆です。私は(便利なヌル文字で終了した文字列の)番号を持っており、この番号を構成するバイトが必要です。ただし、私はマイクロコントローラーの32ビットアーキテクチャで作業しているため、32ビットを超える数であるため、atoiを使用する可能性はありません。

元の結果を取り戻すために、最初のリンクで提供されているアルゴリズムを逆にする方法について誰かが考えていますか?私の合同算術スキルは私を失敗させています。

簡単な例:155.207.231.135から0x [24] [23] [12] [66] [9F](角かっこでバイトを区切ります)

4

3 に答える 3

1

BigInt除算と同様のことができます。

a = atoi of lower 7 decimal digits
b = atoi of remaining upper decimal digits


for (int i = 0; i < 5; i++)
{
    a += 10000000 * (b % 256);
    b /= 256;
    Result[i] = a % 256;
    a /= 256;
}
于 2009-08-13T15:49:53.517 に答える
0

これにはアセンブラが必要です。擬似コード:

int low = 0 // lower 32 bit
int high = 0 // higher 32 bit

for (int i=0; i<string.length(); i++) {
    int digit = string.get(i) - '0';
    int a = low;
    int b = high;
    a <<= 1; b += overflow;             // *2
    a <<= 1; b += overflow;             // *4
    a += low; b += overflow; b += high; // *5
    a <<= 1; b += overflow;             // *10
    a += digit; b += overflow;          // +digit
    low = a; high = b;
}

したがって、基本的には、2つの32ビットintを使用して64ビットレジスタを作成します。ループごとに、次のことを行います。

    value *= 10 + digit;

その後、目的のバイトを取得するには、結果の値の先頭にある0バイトをスキップするだけで済みます。

于 2009-08-13T15:36:39.933 に答える
0

文字列を左から右に解析し、前の結果に10を掛けて、数字を加算するだけです。

概念を示すためのC#のコードを次に示します。配列を計算するための最初の2つの方法:

static void Mul(byte[] data, int num) {
   int n = 0;
   for (int i = data.Length - 1; i >= 0; i--) {
      n += (int)data[i] * num;
      data[i] = (byte)n;
      n >>= 8;
   }
}

static void Add(byte[] data, int num) {
   for (int i = data.Length - 1; num > 0; i-- ) {
      num += (int)data[i];
      data[i] = (byte)num;
      num >>= 8;
   }
}

次に、次のことを行います。

string s = "155207231135";
byte[] result = new byte[16];
foreach (char c in s) {
   Mul(result, 10);
   Add(result, c - '0');
}

結果はresult配列内にあり、左側にゼロバイトが埋め込まれます。

Cに翻訳するのは難しいことではありません...:)

于 2009-08-13T15:51:29.067 に答える