![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перевод файла в троичной системе в аски и обратно.
bot77 © (2009-06-11 16:33:00)Собственно сабж. Дается файл в троичной системе счисления (состоящий из 0,1 и 2). Нужно перевести его в аски. И еще нужно функцию обратного перевода из аски в троичную.
Не нашел ни одной ф-ции перевода типа hextobin, как вообще называется троичная система?
Потом я так понял рассматривать нужно группы по 5 байт, но проблема в том что длина файла не обязательно кратна 5ти. В конце может остаться 2 байта например. Тогда я думаю можно в самом конце поставить контрольный символ из набора 256-3*3*3*3*3 и чтобы они означали длину последнего элемента. С алгоритмом вроде разобрался, а вот накодить нифига не получается, все время вылетает на обработке последних элементов, причем без разницы стринг я обрабатываю или беру из фала. Да и перевод из троичной системы в десятиричную сделал, а обратно фиг знает как. Может кто знает имя стандартной ф-ции конверсии? И подскажет как грамотно обработать звост если размер файла мод 5 больше нуля.
palva (2009-06-12 08:27:00) [1]
> профессор небось рисовал алгоритм перевода из одной системы в другую
Ну это вряд ли. Профессор, который предлагает студенту перевести файл из троичной системы в ASCII, вряд ли в курсе таких алгоритмов.
Нат (2009-06-12 07:02:00) [2]Мда... На лекции ходить надо, профессор небось рисовал алгоритм перевода из одной системы в другую.
Приводить код как-то не правильно...
Хотя... За 0,5 сек Яндекс выдает пару-тройку реализаций и толкований.
Проверено.
oldman (2009-06-11 21:28:00) [3]
> MsGuns © (11.06.09 21:08) [21]
:)
А забавная ветка, да?
Я уже давно интересуюсь, почему перед написанием вопроса автор не открывает учебник математики средней школы?
MsGuns (2009-06-11 21:08:00) [4]Застрелиться !
Вам надо в кассиры итти - деньги выдавать. Народ в вас души не будет чаять.
Вот только недолго ;(
Сергей М. (2009-06-11 20:43:00) [5]
> троичной системе в аски
Кислое в зеленое ?)
bot77 (2009-06-11 18:18:00) [6]спасибо oldman, твой способ гораздо быстрее и проще! не надо возиться с степенями и прочим. Грандмерси!
oldman (2009-06-11 18:12:00) [7]И так из любой системы в любую.
Хотя наши привыкли сначала в 10, потом в любую,
потому, что поделить 2002021 (3) на 724150 (8) проблематично...
:)
oldman (2009-06-11 18:07:00) [8]
> bot77 © (11.06.09 17:57) [16]
Проще.
Предположим, надо перевести в 3 число 177.
Делим 177 на 3, получаем 59, остаток от деления 0
Делим 59 на 3, получаем 19, остаток от деления 2
Делим 19 на 3, получаем 6, остаток от деления 1
Делим 6 на 3, получаем 2, остаток от деления 0
Делим 2 на 3, не делится, остаток от деления 2 (Если вместо 2 будет 0, последний этап не нужен)
Записываем остатки в обратном порядке - 20120
Проверяем: 20120 = 2*3^4+0*3^3+1*3^2+2*3^1+0*3^0=2*81+0*27+1*9+2*3+0*1=162+0+9+6+0=177
Сошлось, блин!
bot77 (2009-06-11 17:57:00) [9]ну да делю сначала на 3 в пятой, результат присваиваю пустому стрингу, потом вычитаю из переводимого числа 3 в пятой, остаток делю на 3 в четвертой, и так до конца, на выходе стринг из 5ти знаков.
oldman (2009-06-11 17:50:00) [10]Обратный перевод - принцип знаешь?
bot77 (2009-06-11 17:50:00) [11]Ладно, спасибо всем откликнувшимся, появилась пара идей, попробую реализовать.
bot77 (2009-06-11 17:47:00) [12]>Принцип описан в любом учебнике математики.
принцип я понял, и даже вроде сделал односторонний перевод, но не обратно. Я с паскалем плохо знаком, мне больше пхп нравится.
bot77 (2009-06-11 17:44:00) [13]>Архивацию изобретаешь?
Я задачу решаю, это профессор что-то изобретает. Я алгоритм понять могу, а вот в коде все время ошибки. Обход звоста я рассказал выше, просто в конце конечного файла, последний байт будет обознаяать длину хвоста. И байт этот будет с chr(255) для 0, chr(254) для 1, и chr(250) для 5. Так как первые 243 какбы щарезервированы.
А так да, ардивация, для файлов состоящих только из 3 возможных символов :)))
oldman (2009-06-11 17:42:00) [14]
> Может кто знает имя стандартной ф-ции конверсии?
Пишется минут за пять.
Принцип описан в любом учебнике математики.
oldman (2009-06-11 17:36:00) [15]
> bot77 © (11.06.09 17:28) [8]
> Иными словами на выходе мы имеем файл в 5 раз меньшей длинны
Если типа для уменьшения длины так и переводи христа ради.
Исходная программа этот файл больше не съест, наверное.
Архивацию изобретаешь?
А если длина файла не кратна 5 - изобрести обход просто. Мозги включи!
oldman (2009-06-11 17:33:00) [16]
> Ega23 © (11.06.09 16:40) [2]
> Троичная запись -> Двоичная запись
> 0 -> 0
> 1 -> 1
> 2 -> 10
Да... Ну ты мочканул! :)))
202 = 18+0+2 = 20
10010 = 16+2 = 18
bot77 (2009-06-11 17:28:00) [17]искал ответы - нашел вопросы :)
oldman, 107 я привел для примера перевода по методу Ega23.
Входные данные вида: 100120120102012010200210201021021010021020102102102010012012100
И так порядка пары мегабайт, мне нужно перевести этот файл в АСКИ, как еслибы был файл вида 0101010101010101110101100010011101011010101011110101010101010001010 мы могли бы брать группы по 8, и переводить их АСКИ символы, так как их всего 256, и 256 - 8бит.
Так как файл у нас какбы в троичной системе, то группа по 8 не поместится в 256 вариантов, максимальная длина 5, если брать больше то одним символом будет уже не обойтись.
Иными словами на выходе мы имеем файл в 5 раз меньшей длинны, но состоящий из всех возможных символов, не только 0,1 или 2.
oldman (2009-06-11 17:19:00) [18]
> тогда разбив на группы по 5
То есть ты надеешься, что 1 тебе напишут как 00001?
Наивный.
Если файл идет потоком, задача неразрешима.
oldman (2009-06-11 17:12:00) [19]
> и тогда число 107 например должно быть 10111
Да ну?
2^4+2^2+2^1+2^0=16+4+2+1=23
107 будет 1101011
Ega23 (2009-06-11 17:08:00) [20]
> Чтото я плохо вас понял.
Лично я задачу совсем не понял.
Покажи входные данные.