Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.09;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.012 c
11-1204664342
=BuckLr=
2008-03-04 23:59
2009.08.09
Вопрос по KOLMediaPlayer


2-1245002203
Mimi
2009-06-14 21:56
2009.08.09
Создание "Справки" и "О программе"


15-1244547469
ТИМА
2009-06-09 15:37
2009.08.09
Неполные уравнения


15-1244484954
{RASkov}
2009-06-08 22:15
2009.08.09
Алгоритмы хеширования


15-1244175479
SPeller
2009-06-05 08:17
2009.08.09
Проектирование интерфейса