Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2014, 18:30   #1
Karateka
Пользователь
 
Регистрация: 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.
Изображения
Тип файла: jpg 12345.JPG (27.6 Кб, 100 просмотров)
Karateka вне форума Ответить с цитированием
Старый 01.06.2014, 18:49   #2
Karateka
Пользователь
 
Регистрация: 25.05.2013
Сообщений: 33
По умолчанию

Сейчас проверил, написал в коде:
Код:
a := chr(236);
Memo1.Lines.Add(a);
Выводит непонятный символ который показан на скриншоте [chr(236)]
Karateka вне форума Ответить с цитированием
Старый 01.06.2014, 19:26   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Что значит непонятный?
Это символ ASCII. Просто он не олицетворяет ни русский ни латинский алфавит.
Цитата:
К примеру chr(236) должно давать букву 'м'
А чего ты это так решил то?
Вот же таблица кодов:
Цитата:
1 ☺ 2 ☻ 3 ♥ 4 ♦ 5 ♣ 6 ♠ 7 8
9 10
14 ♫ 15 ☼ 16 ► 17 ◄ 18 ↕ 19 ‼ 20 ¶ 21 §
22 ▬ 23 ↨ 24 ↑ 25 ↓ 26 → 27 ← 28 ∟ 29 ↔
30 ▲ 31 ▼ 32 33 ! 34 " 35 # 36 $ 37 %
38 & 39 ' 40 ( 41 ) 42 * 43 + 44 , 45 -
46 . 47 / 48 0 49 1 50 2 51 3 52 4 53 5
54 6 55 7 56 8 57 9 58 : 59 ; 60 < 61 =
62 > 63 ? 64 @ 65 A 66 B 67 C 68 D 69 E
70 F 71 G 72 H 73 I 74 J 75 K 76 L 77 M
78 N 79 O 80 P 81 Q 82 R 83 S 84 T 85 U
86 V 87 W 88 X 89 Y 90 Z 91 [ 92 \ 93 ]
94 ^ 95 _ 96 ` 97 a 98 b 99 c 100 d 101 e
102 f 103 g 104 h 105 i 106 j 107 k 108 l 109 m
110 n 111 o 112 p 113 q 114 r 115 s 116 t 117 u
118 v 119 w 120 x 121 y 122 z 123 { 124 | 125 }
126 ~ 127  128 А 129 Б 130 В 131 Г 132 Д 133 Е
134 Ж 135 З 136 И 137 Й 138 К 139 Л 140 М 141 Н
142 О 143 П 144 Р 145 С 146 Т 147 У 148 Ф 149 Х
150 Ц 151 Ч 152 Ш 153 Щ 154 Ъ 155 Ы 156 Ь 157 Э
158 Ю 159 Я 160 а 161 б 162 в 163 г 164 д 165 е
166 ж 167 з 168 и 169 й 170 к 171 л 172 м 173 н
174 о 175 п 176 ░ 177 ▒ 178 ▓ 179 │ 180 ┤ 181 ╡
182 ╢ 183 ╖ 184 ╕ 185 ╣ 186 ║ 187 ╗ 188 ╝ 189 ╜
190 ╛ 191 ┐ 192 └ 193 ┴ 194 ┬ 195 ├ 196 ─ 197 ┼
198 ╞ 199 ╟ 200 ╚ 201 ╔ 202 ╩ 203 ╦ 204 ╠ 205 ═
206 ╬ 207 ╧ 208 ╨ 209 ╤ 210 ╥ 211 ╙ 212 ╘ 213 ╒
214 ╓ 215 ╫ 216 ╪ 217 ┘ 218 ┌ 219 █ 220 ▄ 221 ▌
222 ▐ 223 ▀ 224 р 225 с 226 т 227 у 228 ф 229 х
230 ц 231 ч 232 ш 233 щ 234 ъ 235 ы 236 ь 237 э
238 ю 239 я 240 Ё 241 ё 242 Є 243 є 244 Ї 245 ї
246 Ў 247 ў 248 ° 249 ∙ 250 · 251 √ 252 № 253 ¤
254 ■ 255 *
236-й символ это мягкий знак.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.06.2014, 19:46   #4
Karateka
Пользователь
 
Регистрация: 25.05.2013
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
236-й символ это мягкий знак.
Я смотрел в таблицу ANSII =) То есть в Меmo будет выводиться через кодировку ASCII? А как тогда сделать чтобы выводило мягкий знак?

Забыл еще спросить почему ord() выводит численное значение другое
Код:
a := chr(236) ;
q := ord(a);
Memo1.Lines.Add(inttostr(q));
в переменной q значение 17867244, а ведь должно 236.

Просто к чему я виду. Полученные значения, я преобразовываю в символы через chr, записываю в файл. Получается сжатый файл. А обратно не получается раскодировать, т.к. ord возвращает другие значения. До этого я делал консольное приложение, там была беда в том что, когда я записывал в файл chr(201), то записывался символ 'E', а когда брал от этого символа ord(), то получал не 201, а совсем другое число.
Karateka вне форума Ответить с цитированием
Старый 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
Karateka
Пользователь
 
Регистрация: 25.05.2013
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
chr(236) это вообще-то код юникодного двухбайтного символа $00EC, а не просто однобайтного $EC. XE однако

ADD

А что за велосипед? BASE64 этим же занимается и не только для текстовой информации
Лабораторная просто) Так как быть с этим.

Мне всего лишь надо, допустим от числа 203 взять его символьное значение, записать в файл, и обратное: из файла взять символ, получить его числовое значение (203), чтобы дальше раскодировать.

еще меня интересует, почему ord(), такое значение возвращает?
a := chr(236) ;
q := ord(a);
Memo1.Lines.Add(inttostr(q));

в переменной q значение 17867244, а ведь должно 236.
Karateka вне форума Ответить с цитированием
Старый 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
Karateka
Пользователь
 
Регистрация: 25.05.2013
Сообщений: 33
По умолчанию

поставил переменным ansistring. Читаю из файла символы, кидаю их в ord(), выдает для некоторых неправильные значения, для некоторых правильные. Получается первые три байта (символа) он распознает как совсем другие, а второй и последние два как надо.

Голова кругом, не могу понять как-так. Единственное что на уме так это кодировка.
Изображения
Тип файла: jpg yeah.jpg (29.2 Кб, 116 просмотров)

Последний раз редактировалось Karateka; 01.06.2014 в 23:35.
Karateka вне форума Ответить с цитированием
Старый 02.06.2014, 00:02   #9
Karateka
Пользователь
 
Регистрация: 25.05.2013
Сообщений: 33
По умолчанию

Решил по экспериментировать, в итоге символ 113 из файла читается правильно - символ q, а вот символ 128 уже нет, возвращает значение как 63. То есть это получается таблица ASCII, в ней то как раз 127 символов.
Karateka вне форума Ответить с цитированием
Старый 04.06.2014, 23:23   #10
Karateka
Пользователь
 
Регистрация: 25.05.2013
Сообщений: 33
По умолчанию

С этой проблемой разобрался. Теперь проблема в том, что когда открываю файл и читаю из него содержимое, то читается не весь текстовый файл. Как прочесть полностью файл.

Вот как я читаю:
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure UNPACK_BITS();
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  opendialog: Topendialog;
  p_file2 : textfile;
  _DirPath_FileName : string;
  i : integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  openDialog := TOpenDialog.Create(self);
  if openDialog.Execute then
   else Exit;
  _DirPath_FileName := openDialog.FileName;
  Memo1.Lines.Add('Путь до файла и его имя: ' + _DirPath_FileName);
  openDialog.Free;
  UNPACK_BITS();

end;

procedure TForm1.UNPACK_BITS();
var
 temp : integer;
 str3 : TStringList;
 p_text3 : array of ansichar;
 p_text4: ansistring;
begin
 AssignFile (p_file2, _DirPath_FileName);
 Reset(p_file2);
  str3 := TStringlist.Create();
  Str3.LoadFromFile(_DirPath_FileName);
  for I := 0 to Str3.Count - 1 do
    p_text4 := p_text4 + Str3.Strings[I];
  Str3.Free;
  Memo1.Lines.Add(p_text4);
   Memo1.Lines.Add(inttostr(length(p_text4)));
end;

end.
Текстовый файл весит 1703 байта
Когда его считал моя переменная весит всего 1696; То есть теряются какие-то символы, потом при обратной раз кодировке, где-то начиная с середины файл не правильно разкодировывается.

Выяснил что почему-то выкидывается символ 13, то есть символ конца строки. Подскажите как прочитать так, чтобы этот символ не отбрасывался. Привожу скриншот где видно, что при записи в файл он есть, когда читаю из файла, то его уже нет.
Изображения
Тип файла: jpg Безымянный1123.jpg (94.9 Кб, 154 просмотров)
Karateka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод данных в массив записей из текстового файла, сортировка по ключу, вывод в файл (на Паскаль) 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