Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перевод файла в троичной системе в аски и обратно.


Страницы:   1 2

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]


> Чтото я плохо вас понял.


Лично я задачу совсем не понял.
Покажи входные данные.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо