Возможна ли потоковая передача шестнадцатеричных цифр и вывод потока в десятичном формате, не дожидаясь появления всех данных
Допустим, у вас есть файл, содержащий гигабайты
deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef
и вы хотите преобразовать его в десятичную, так же, как вы бы 0xdeadbeef до 3 735 928 559.
С базами, число которых делится на 2, это легко сделать, поскольку вы можете работать с каждыми несколькими битами и выводить число (6 для base64).
Любой способ сделать это с десятичной?
РЕДАКТИРОВАТЬ: файл представляет собой одно длинное число. Тот факт, что он повторяется, ничем не отличается от числа 55,055,055,055.
EDIT2: размер файла известен. Что тогда?
2 ответа
Обычно вы можете начать писать, прежде чем закончите читать ввод. Но если число очень близко к десяти, вам, возможно, придется прочитать больше половины ввода, прежде чем вы сможете написать первую цифру вывода!
Чтобы понять почему, возьмите сравнительно небольшой пример. Предположим, что число составляет 1060. Шестнадцатеричное кодирование для этого составляет 50 шестнадцатеричных цифр. Прочитав первые 34 цифры, вы знаете это много:
9f4f2726179a224501d762422c946590d9................
Точки - это цифры, которые вы еще не прочитали.
На этом этапе вы все еще не можете написать первую цифру вывода, потому что ввод может быть любым из
9f4f2726179a224501d762422c946590d90000000000000000
в
9f4f2726179a224501d762422c946590d9ffffffffffffffff
И первое является десятичным 999999999999999999999999999999999999999998847078495393153024, но последнее составляет 100000000000000000000000000000000000000000000000000000017293822569102704639. Таким образом, вы все еще не знаете, писать 1 или 9! Только после 35-й входной цифры вы можете начать писать вывод.
Как правило, вам придется прочитать около трех четвертей входных данных, прежде чем писать первую выходную цифру, в худшем случае.
Неправильно, неправильно неправильно. Смотрите комментарии.
Да, но вы должны работать в обратном направлении (т.е. начинать с конца файла).
- Прочитайте последнюю цифру.
- Преобразуйте цифру в десятичную, напечатайте ее и сохраните самую значимую цифру.
- Прочитайте следующую цифру слева.
- Добавьте предыдущую наиболее значимую цифру, преобразуйте в десятичную, напечатайте ее и сохраните новую наиболее значимую цифру.
- Повторите с шага 3.
Редактировать: Добавлено там, где печатаются цифры. В результате получается десятичное число в обратном порядке (сначала младшая цифра).