|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
01.06.2014, 18:30 | #1 |
Пользователь
Регистрация: 25.05.2013
Сообщений: 33
|
Сжатие текстового файл с 8бит в 6бит
Нужно сжать файл txt с 8бит в 6бит. Беру только следующие символы: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghi jklmnopqrstuvwxyz !?-+=()*%"
Дальше, каждому из них ставлю в соответствие номер: A - 000001, B - 000010, C - 000011 и т.д. Допустим у нас слово ABCD. Cжимаю. В первый байт записываю первый символ - A, затем беру следующий символ - B, два бита записываю в первый байт, оставшиеся четыре бита во второй байт, следующий символ С, записываю четыре бита во второй байт, оставшиеся два в третий байт, беру символ - D, записываем целиком в третий байт. В итоге четыре символа уместились в три байта. Проблема в следующем. В файл вбиваю следующее слово: qwerty. В итоге получаю: 1-й бит [175], 2-й бит [23], 3-й бит [236], 4-й бит [187], 5-й бит [48]. От каждого числа беру его символьное значение с помощью функции chr(), чтобы записать в файл. В итоге символьное значение совсем не соответствуют. На скриншоте показано. К примеру chr(236) должно давать букву 'м', а она выдает совсем другой символ. А вот chr(48), выдает правильное символьное соответствие, выводит символ ' 0 '. Я думаю проблема возможна в кодировке? В чем проблема, подскажите пожалуйста. Использую Delphi XE2. |
01.06.2014, 18:49 | #2 |
Пользователь
Регистрация: 25.05.2013
Сообщений: 33
|
Сейчас проверил, написал в коде:
Код:
|
01.06.2014, 19:26 | #3 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Что значит непонятный?
Это символ ASCII. Просто он не олицетворяет ни русский ни латинский алфавит. Цитата:
Вот же таблица кодов: Цитата:
I'm learning to live...
|
||
01.06.2014, 19:46 | #4 |
Пользователь
Регистрация: 25.05.2013
Сообщений: 33
|
Я смотрел в таблицу ANSII =) То есть в Меmo будет выводиться через кодировку ASCII? А как тогда сделать чтобы выводило мягкий знак?
Забыл еще спросить почему ord() выводит численное значение другое Код:
Просто к чему я виду. Полученные значения, я преобразовываю в символы через chr, записываю в файл. Получается сжатый файл. А обратно не получается раскодировать, т.к. ord возвращает другие значения. До этого я делал консольное приложение, там была беда в том что, когда я записывал в файл chr(201), то записывался символ 'E', а когда брал от этого символа ord(), то получал не 201, а совсем другое число. |
01.06.2014, 19:57 | #5 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
chr(236) это вообще-то код юникодного двухбайтного символа $00EC, а не просто однобайтного $EC. XE однако
ADD А что за велосипед? BASE64 этим же занимается и не только для текстовой информации
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 01.06.2014 в 20:06. |
01.06.2014, 20:29 | #6 | |
Пользователь
Регистрация: 25.05.2013
Сообщений: 33
|
Цитата:
Мне всего лишь надо, допустим от числа 203 взять его символьное значение, записать в файл, и обратное: из файла взять символ, получить его числовое значение (203), чтобы дальше раскодировать. еще меня интересует, почему ord(), такое значение возвращает? a := chr(236) ; q := ord(a); Memo1.Lines.Add(inttostr(q)); в переменной q значение 17867244, а ведь должно 236. |
|
01.06.2014, 20:53 | #7 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Сделай тип у a Char вместо String
Или оставь String, но сделай q := ord(a[1]); И посмотри в юникоде какой символ соответствует коду 236 И работай с AnsiString, а не со String
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 01.06.2014 в 20:56. |
01.06.2014, 23:15 | #8 |
Пользователь
Регистрация: 25.05.2013
Сообщений: 33
|
поставил переменным ansistring. Читаю из файла символы, кидаю их в ord(), выдает для некоторых неправильные значения, для некоторых правильные. Получается первые три байта (символа) он распознает как совсем другие, а второй и последние два как надо.
Голова кругом, не могу понять как-так. Единственное что на уме так это кодировка. Последний раз редактировалось Karateka; 01.06.2014 в 23:35. |
02.06.2014, 00:02 | #9 |
Пользователь
Регистрация: 25.05.2013
Сообщений: 33
|
Решил по экспериментировать, в итоге символ 113 из файла читается правильно - символ q, а вот символ 128 уже нет, возвращает значение как 63. То есть это получается таблица ASCII, в ней то как раз 127 символов.
|
04.06.2014, 23:23 | #10 |
Пользователь
Регистрация: 25.05.2013
Сообщений: 33
|
С этой проблемой разобрался. Теперь проблема в том, что когда открываю файл и читаю из него содержимое, то читается не весь текстовый файл. Как прочесть полностью файл.
Вот как я читаю: Код:
Когда его считал моя переменная весит всего 1696; То есть теряются какие-то символы, потом при обратной раз кодировке, где-то начиная с середины файл не правильно разкодировывается. Выяснил что почему-то выкидывается символ 13, то есть символ конца строки. Подскажите как прочитать так, чтобы этот символ не отбрасывался. Привожу скриншот где видно, что при записи в файл он есть, когда читаю из файла, то его уже нет. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ввод данных в массив записей из текстового файла, сортировка по ключу, вывод в файл (на Паскаль) | orandzheviyman | Помощь студентам | 8 | 21.01.2014 08:15 |
из текстового файл получить 5 наиболее часто встречающихся слов и число их появлений (на Delphi) | sifa | Помощь студентам | 5 | 09.01.2012 18:34 |
на Файл текстового типа | antojke | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 14.12.2011 08:35 |
Как из текстового файла перенести данные в excel файл | hunter05 | Microsoft Office Excel | 1 | 08.09.2009 06:30 |
из одного текстового файла виделить цифры и поместить в другой(пустой) файл | serguna005 | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 07.12.2008 20:55 |