Возможна ли потоковая передача шестнадцатеричных цифр и вывод потока в десятичном формате, не дожидаясь появления всех данных - PullRequest
1 голос
/ 16 декабря 2010

Скажем, у вас есть файл, содержащий гигабайты

deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef

, и вы хотите преобразовать его в десятичную, так же, как вы бы от 0xdeadbeef до 3 735 928 559.

С базами, число которых делится на 2, это легко сделать, поскольку вы можете работать с каждыми несколькими битами и выводить число (6 для base64).

Есть ли способ сделать это с десятичной дробью?

РЕДАКТИРОВАТЬ: файл представляет собой одно длинное число. Тот факт, что он повторяется, ничем не отличается от числа 55,055,055,055.

EDIT2: размер файла известен. Что тогда?

Ответы [ 2 ]

5 голосов
/ 16 декабря 2010

Обычно вы можете начать писать, прежде чем закончите читать ввод. Но если число очень близко к десяти, вам, возможно, придется прочитать больше половины ввода, прежде чем вы сможете написать первую цифру вывода!

Чтобы понять почему, возьмите сравнительно небольшой пример. Предположим, что число 10 60 . Шестнадцатеричное кодирование для этого составляет 50 шестнадцатеричных цифр. Прочитав первые 34 цифры, вы знаете это очень много:

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

Точки - это цифры, которые вы еще не прочитали.

В этот момент вы все еще не можете записать первую цифру вывода, потому что ввод может быть любым из

9f4f2726179a224501d762422c946590d90000000000000000

до

9f4f2726179a224501d762422c946590d9ffffffffffffffff

И первый является десятичным 999999999999999999999999999999999999999998847078495393153024, но последний - 100000000000000000000000000000000000000000000000000000017293822569102704639. Таким образом, вы все еще не знаете, писать 1 или 9! Только после 35-й входной цифры вы можете начать писать вывод.

Как правило, в худшем случае вам придется прочитать около трех четвертей ввода, прежде чем писать первую выходную цифру.

0 голосов
/ 16 декабря 2010

Неправильно, неправильно неправильно.См. Комментарии.

Да, но вы должны работать в обратном направлении (т.е. начинать с конца файла).

  1. Считать последнюю цифру.
  2. Преобразовать цифру в десятичную, распечатать и сохранить наиболее значимую цифру.
  3. Считать следующую цифру слева.
  4. Добавьте предыдущую наиболее значимую цифру, преобразуйте в десятичную, напечатайте ее и сохраните новую наиболее значимую цифру.
  5. Повторите с шага 3.

Редактировать: добавлено гдецифры напечатаны.В результате получается десятичное число на выходе в обратном порядке (сначала младшая значащая цифра).

...