Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.007 c
11-1204664342
=BuckLr=
2008-03-04 23:59
2009.08.09
Вопрос по KOLMediaPlayer


15-1244183113
Dennis I. Komarov
2009-06-05 10:25
2009.08.09
MS VC++ 2008 EE (или УЮ :) )


6-1205611995
art36
2008-03-15 23:13
2009.08.09
Обмен данными с тайм-сервером (сервером точного времени)


15-1244012984
oldman
2009-06-03 11:09
2009.08.09
Internet Explorer 8.0 Windows XP (yandex edition)


15-1244535124
SPeller
2009-06-09 12:12
2009.08.09
Кто-нить сталкивался?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский