1

ギガバイト相当のファイルがあるとします。

deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef

0xdeadbeefを3,735,928,559に変換するのと同じ方法で、それを10進数に変換します。

数値が2で割り切れるベースは、数ビットごとに操作して数値(base64の場合は6)を出力できるため、これを簡単に行うことができます。

これを小数で行う方法はありますか?

編集:ファイルは1つの長い数字を表します。それが繰り返されるという事実は、55,055,055,055という数字と何ら変わりはありません。

EDIT2:ファイルのサイズは既知です。では、どうしますか?

4

2 に答える 2

5

通常、入力を読み終わる前に書き始めることができます。しかし、数値が 10 の累乗に非常に近い場合、出力の最初の桁を書き込む前に、入力の半分以上を読み取らなければならない場合があります。

その理由を理解するために、比較的小さな例を取り上げます。数が 10 60であるとします。これの 16 進エンコードは 50 桁の 16 進数です。最初の 34 桁を読むと、次のことがわかります。

9f4f2726179a224501d762422c946590d9................

ドットは、まだ読んでいない数字です。

この時点では、出力の最初の桁をまだ書き込めません。

9f4f2726179a224501d762422c946590d90000000000000000

9f4f2726179a224501d762422c946590d9ffffffffffffffff

And the former is decimal 999999999999999999999999999999999999999998847078495393153024, but the latter is 1000000000000000000000000000000000000000017293822569102704639. So you still don't know whether to write a 1 or a 9! 35 番目の入力桁まで、出力の書き込みを開始できません。

一般に、最悪の場合、最初の出力桁を書き込む前に、入力の約 4 分の 3 を読み取る必要があります。

于 2010-12-16T07:41:42.880 に答える
0

違う、違う、違う。コメントを参照してください。

はい。ただし、逆方向に作業する必要があります (つまり、ファイルの末尾から開始します)。

  1. 最後の桁を読み取ります。
  2. 数字を 10 進数に変換して出力し、最上位の数字を保存します。
  3. 左の次の桁を読み取ります。
  4. 前の最上位桁を追加し、10 進数に変換して印刷し、新しい最上位桁を保存します。
  5. 手順 3 から繰り返します。

編集:数字が印刷される場所を追加しました。これにより、出力 10 進数が逆順 (最下位桁が最初) に生成されます。

于 2010-12-16T06:52:15.357 に答える