Форум: "Начинающим";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];
ВнизПеревод файла в троичной системе в аски и обратно. Найти похожие ветки
← →
bot77 © (2009-06-11 16:33) [0]Собственно сабж. Дается файл в троичной системе счисления (состоящий из 0,1 и 2). Нужно перевести его в аски. И еще нужно функцию обратного перевода из аски в троичную.
Не нашел ни одной ф-ции перевода типа hextobin, как вообще называется троичная система?
Потом я так понял рассматривать нужно группы по 5 байт, но проблема в том что длина файла не обязательно кратна 5ти. В конце может остаться 2 байта например. Тогда я думаю можно в самом конце поставить контрольный символ из набора 256-3*3*3*3*3 и чтобы они означали длину последнего элемента. С алгоритмом вроде разобрался, а вот накодить нифига не получается, все время вылетает на обработке последних элементов, причем без разницы стринг я обрабатываю или беру из фала. Да и перевод из троичной системы в десятиричную сделал, а обратно фиг знает как. Может кто знает имя стандартной ф-ции конверсии? И подскажет как грамотно обработать звост если размер файла мод 5 больше нуля.
← →
Ega23 © (2009-06-11 16:37) [1]
> Потом я так понял рассматривать нужно группы по 5 байт,
С чего ты взял?
← →
Ega23 © (2009-06-11 16:40) [2]Троичная запись -> Двоичная запись
0 -> 0
1 -> 1
2 -> 10
Соответственно, файл вида 20120102012010200101 будет выглядеть
1001100101001100101000101
Ну и, естественно, файл должен быть текстовым.
← →
bot77 © (2009-06-11 16:52) [3]Чтото я плохо вас понял.
одним аски символом я могу выразить 256 вариантов = 2*2*2*2*2*2*2*2
и 243 троичных варианта = 3*3*3*3*3
Скажем есть файл 20120102012010200101, тогда разбив на группы по 5
20120 10201 20102 00101, и делаю следующее
для 20120 = 2*81+1*9+2*3 = 177, вот я в результат и пишу chr(177).
ваш вариант мне показался очень интересным, но я его не понял, что на самом деле достаточно заменит все 2 на 10?
← →
bot77 © (2009-06-11 17:02) [4]тоесть елси следовать дальше по логике
0 -> 0
1 -> 1
2 -> 10
3 -> 11
4 -> 100
5 -> 101
6 -> 110
7 -> 111
8 -> 1000
9 -> 1001
и тогда число 107 например должно быть 10111, но это не так. Можете обьяснить ваш подход?
← →
Ega23 © (2009-06-11 17:08) [5]
> Чтото я плохо вас понял.
Лично я задачу совсем не понял.
Покажи входные данные.
← →
oldman © (2009-06-11 17:12) [6]
> и тогда число 107 например должно быть 10111
Да ну?
2^4+2^2+2^1+2^0=16+4+2+1=23
107 будет 1101011
← →
oldman © (2009-06-11 17:19) [7]
> тогда разбив на группы по 5
То есть ты надеешься, что 1 тебе напишут как 00001?
Наивный.
Если файл идет потоком, задача неразрешима.
← →
bot77 © (2009-06-11 17:28) [8]искал ответы - нашел вопросы :)
oldman, 107 я привел для примера перевода по методу Ega23.
Входные данные вида: 100120120102012010200210201021021010021020102102102010012012100
И так порядка пары мегабайт, мне нужно перевести этот файл в АСКИ, как еслибы был файл вида 0101010101010101110101100010011101011010101011110101010101010001010 мы могли бы брать группы по 8, и переводить их АСКИ символы, так как их всего 256, и 256 - 8бит.
Так как файл у нас какбы в троичной системе, то группа по 8 не поместится в 256 вариантов, максимальная длина 5, если брать больше то одним символом будет уже не обойтись.
Иными словами на выходе мы имеем файл в 5 раз меньшей длинны, но состоящий из всех возможных символов, не только 0,1 или 2.
← →
oldman © (2009-06-11 17:33) [9]
> Ega23 © (11.06.09 16:40) [2]
> Троичная запись -> Двоичная запись
> 0 -> 0
> 1 -> 1
> 2 -> 10
Да... Ну ты мочканул! :)))
202 = 18+0+2 = 20
10010 = 16+2 = 18
← →
oldman © (2009-06-11 17:36) [10]
> bot77 © (11.06.09 17:28) [8]
> Иными словами на выходе мы имеем файл в 5 раз меньшей длинны
Если типа для уменьшения длины так и переводи христа ради.
Исходная программа этот файл больше не съест, наверное.
Архивацию изобретаешь?
А если длина файла не кратна 5 - изобрести обход просто. Мозги включи!
← →
oldman © (2009-06-11 17:42) [11]
> Может кто знает имя стандартной ф-ции конверсии?
Пишется минут за пять.
Принцип описан в любом учебнике математики.
← →
bot77 © (2009-06-11 17:44) [12]>Архивацию изобретаешь?
Я задачу решаю, это профессор что-то изобретает. Я алгоритм понять могу, а вот в коде все время ошибки. Обход звоста я рассказал выше, просто в конце конечного файла, последний байт будет обознаяать длину хвоста. И байт этот будет с chr(255) для 0, chr(254) для 1, и chr(250) для 5. Так как первые 243 какбы щарезервированы.
А так да, ардивация, для файлов состоящих только из 3 возможных символов :)))
← →
bot77 © (2009-06-11 17:47) [13]>Принцип описан в любом учебнике математики.
принцип я понял, и даже вроде сделал односторонний перевод, но не обратно. Я с паскалем плохо знаком, мне больше пхп нравится.
← →
bot77 © (2009-06-11 17:50) [14]Ладно, спасибо всем откликнувшимся, появилась пара идей, попробую реализовать.
← →
oldman © (2009-06-11 17:50) [15]Обратный перевод - принцип знаешь?
← →
bot77 © (2009-06-11 17:57) [16]ну да делю сначала на 3 в пятой, результат присваиваю пустому стрингу, потом вычитаю из переводимого числа 3 в пятой, остаток делю на 3 в четвертой, и так до конца, на выходе стринг из 5ти знаков.
← →
oldman © (2009-06-11 18:07) [17]
> 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
Сошлось, блин!
← →
oldman © (2009-06-11 18:12) [18]И так из любой системы в любую.
Хотя наши привыкли сначала в 10, потом в любую,
потому, что поделить 2002021 (3) на 724150 (8) проблематично...
:)
← →
bot77 © (2009-06-11 18:18) [19]спасибо oldman, твой способ гораздо быстрее и проще! не надо возиться с степенями и прочим. Грандмерси!
← →
Сергей М. © (2009-06-11 20:43) [20]
> троичной системе в аски
Кислое в зеленое ?)
← →
MsGuns © (2009-06-11 21:08) [21]Застрелиться !
Вам надо в кассиры итти - деньги выдавать. Народ в вас души не будет чаять.
Вот только недолго ;(
← →
oldman © (2009-06-11 21:28) [22]
> MsGuns © (11.06.09 21:08) [21]
:)
А забавная ветка, да?
Я уже давно интересуюсь, почему перед написанием вопроса автор не открывает учебник математики средней школы?
← →
Нат © (2009-06-12 07:02) [23]Мда... На лекции ходить надо, профессор небось рисовал алгоритм перевода из одной системы в другую.
Приводить код как-то не правильно...
Хотя... За 0,5 сек Яндекс выдает пару-тройку реализаций и толкований.
Проверено.
← →
palva © (2009-06-12 08:27) [24]
> профессор небось рисовал алгоритм перевода из одной системы в другую
Ну это вряд ли. Профессор, который предлагает студенту перевести файл из троичной системы в ASCII, вряд ли в курсе таких алгоритмов.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.005 c