2010-12-16 11 views
1

はで、あなたははそれが

deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef 

の価値ギガバイトを含むファイルをお持ちで、小数点のためにそれを変換したいと表示されるように、すべてのデータを待たずに16進数と出力小数でストリームをストリーミングすることが可能です0xdeadbeefと同じ方法で3,735,928,559になります。

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

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

EDIT:このファイルは1つの長い番号を表します。それが繰り返されるという事実は、数字55,055,055,055と変わらない。

EDIT2:ファイルのサイズはわかっています。それでは?

+0

ファイルが単一の番号または番号のリストを表していますか? –

+1

0xAAAAAの1ギガバイトの価値がある場合...すべてのデータが表示された後に何をするのだろうと思います –

+2

ビット列のサイズを事前に知っていますか?そうでない場合は、簡単にこれを行うことはできません。 – cdhowie

答えて

0

誤って間違っています。コメントを参照してください。

はい、逆方向に作業する必要があります(ファイルの最後から始める)。

  1. 最後の数字を読み取ります。
  2. 桁を10進数に変換して印刷し、最上位桁を格納します。
  3. 左側の次の桁を読んでください。
  4. 前の最上位の桁を追加し、小数点に変換して印刷し、新しい最上位の桁を格納します。
  5. ステップ3.

編集からのリピート:追加の数字が印刷されています。これにより、出力10進数が逆順(最下位桁の最初)の順序で生成されます。

+0

しかし、フルファイルが出力される前に何かを出力することができますか? – Jake

+0

入力または出力ファイルを印刷する前に?変換されるごとに各桁を切り取ることができますが、逆順(最下位桁から順に)になります。 –

+0

ミラーを使って出力を読み取るだけです –

5

通常、入力を完了する前に書き込みを開始できます。しかし、その数が10の累乗に非常に近い場合は、出力の最初の桁を書く前に入力の半分以上を読み取らなければならないかもしれません!

理由を確認するには、比較的小さな例を考えてください。番号が10 であるとします。このための16進数エンコーディングは50桁の16進数です。最初の34桁を読み取った後、これは多くを知っています:

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

ドットはまだ読んでいない桁です。この時点で

、入力が

9f4f2726179a224501d762422c946590d9ffffffffffffffff 

9f4f2726179a224501d762422c946590d90000000000000000 

から何かすることができ、前者は10進数ですので、あなたがまだは、出力の最初の数字を書き込むことはできません999999999999999999999999999999999999999998847078495393153024ですが、後者は100000000000000000000000000000000000000000000000000000017293822569102704639です。あなたはまだ1または9を書くかどうかわからない! 35桁目の入力桁が出力の書き込みを開始できるまではありません。

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