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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2012, 18:08   #1
PetrowD
 
Регистрация: 19.02.2012
Сообщений: 4
По умолчанию Вопрос о кодировании

Пытаюсь автоматизировать некий процесс в делфи, и столкнулся с проблемой что иде дельфовая не воспринимает некоторые непечатаемые символы, т.е. рушит некий массив string.
Пользовался base64 для решения этого вопроса, но плохо то что бэйс увеличивает размер генерируемого массива string. Есть ли кодировки типа Base64, которые не увеличат размер генерируемого кода и чтобы кодированный массив был печатаемым?
PetrowD вне форума Ответить с цитированием
Старый 21.02.2012, 01:07   #2
PetrowD
 
Регистрация: 19.02.2012
Сообщений: 4
По умолчанию

нет идей?
слышал что есть модифицированная base64, называется base128. теоретически должна уменьшить размер выходного буфера, т.к. больше символов, и соответственно больше вариантов замены при кодировании...
не попадалась ли кому эта самая base128?
PetrowD вне форума Ответить с цитированием
Старый 21.02.2012, 08:53   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
не воспринимает некоторые непечатаемые символы
В чем проблема? #$Код символа или Chr(код символа) еще не отменяли.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.02.2012, 09:31   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
В чем проблема? #$Код символа или Chr(код символа) еще не отменяли.
проблема в том, что автору темы крайне важно, чтобы размер закодированного текста не превышал (ну или не сильно превышал размер исходного. (правда, я абсолютно не понимаю, зачем ему это!!) в случае #код символов размер увеличится в среднем БОЛЕЕ ЧЕМ В ТРИ РАЗА!

PetrowD, в общем случае ответ на ваш вопрос отрицательный - чудес НЕ БЫВАЕТ - для кодирования БОЛЬШЕГО числа символов МЕНЬШИМ алфавитом потребуется БОЛЬШЕ символов(знаков кодирования). Но в частном случае задача может быть решена. Тут всё ОЧЕНЬ сильно зависит от того, что за символы бывают на входе и какие символы недопустимы на выходе (т.е. что вы называете "массив был печатаемым"), так же важно соотношение допустимых и недопустимых символов... Как вариант можно попытаться предварительно сжать строку, а потом уже кодировать её (в тот же Base64).
Так зачем Вам это всё?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.02.2012, 14:56   #5
PetrowD
 
Регистрация: 19.02.2012
Сообщений: 4
По умолчанию

chr() уже рассматривался и был отколнен, как уже сказал Serge_Bliznykov из за 3х кратного увеличения выходного буфера.
Serge_Bliznykov попробуйте поксорить jpg или mp3 файл, и записать результат в виде массива строк в делфи, т.е. на уровне генерации исходного pas файла. Получим диапазон байт не пригодный для компилирования, задача в том чтобы не увеличивая или не сильно увеличивая размер выходного буфера заменить символы так, чтобы дельфовая среда приняла и скомпилила.
Так зачем Вам это всё?
Хочу реализовать свою давнюю идею, но уже практически на финальном шаге встал такой вопрос... Решил обратиться к обществу.
PetrowD вне форума Ответить с цитированием
Старый 21.02.2012, 15:25   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Получим диапазон байт не пригодный для компилирования,
это почему же?

а если так?
взял свой пример программки BinToPas (писал на коленке, прошу не судить строго)
Код:
procedure TForm1.Button1Click(Sender: TObject);
var TS : TStringList;
  FS : TFileStream;
  s  : string;
  i : integer;
  B : byte;
begin
  TS := TStringList.Create;
  FS := TFileStream.Create('C:\WINDOWS\system32\winmine.exe', fmOpenRead );
  if FS.Size=0 then begin
        Application.MessageBox( 'Размер файла нулевой', 'Ошибка', MB_ICONSTOP or MB_OK);
        Exit;
  end;
  TS.Append('const Fl : array[0..'+IntToStr(FS.Size-1)+'] of byte = (');
  s := '';
  for i:=1 to FS.Size  do begin
     FS.Read(B, 1 );
     s := s + Format('$%x', [B]);
     if i<>FS.Size then s := s + ',';
     if length(s)>50 then begin
       TS.Append(s);
       s := '';
     end;
  end;
  FreeAndNil(FS);

  if length(s)>0 then TS.Append(s);
  TS.Append(');');

  TS.SaveToFile('c:\FL.inc');

  FreeAndNil(TS);

end;
полученный результат выглядит примерно так:
Цитата:
Код:
const Fl : array[0..119807] of byte = (
$4D,$5A,$90,$0,$3,$0,$0,$0,$4,$0,$0,$0,$FF,$FF,$0,$0,
$B8,$0,$0,$0,$0,$0,$0,$0,$40,$0,$0,$0,$0,$0,$0,$0,$0,
$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,
$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$D8,$0,$0,$0,$E,$1F,$BA,
$E,$0,$B4,$9,$CD,$21,$B8,$1,$4C,$CD,$21,$54,$68,$69,
$73,$20,$70,$72,$6F,$67,$72,$61,$6D,$20,$63,$61,$6E,
$6E,$6F,$74,$20,$62,$65,$20,$72,$75,$6E,$20,$69,$6E,
$20,$44,$4F,$53,$20,$6D,$6F,$64,$65,$2E,$D,$D,$A,$24,
$0,$0,$0,$0,$0,$0,$0,$E5,$6A,$12,$49,$A1,$B,$7C,$1A,
$A1,$B,$7C,$1A,$A1,$B,$7C,$1A,$A1,$B,$7C,$1A,$A0,$B,
$7C,$1A,$5B,$28,$3C,$1A,$A0,$B,$7C,$1A,$A1,$B,$7D,$1A,
$C9,$B,$7C,$1A,$5B,$28,$65,$1A,$B0,$B,$7C,$1A,$36,$28,
.....


И чем Вас ресурсные файлы не устраивают? (если уж так категорически нельзя во внешних файлах держать данные)


Добавлено
я взял mp3 размером 9502552 байта. закодировал.
получил файл .INC размером 38 978 732 bytes (количество строк 722825)
всё откомпилировалось... o_O !

Последний раз редактировалось Serge_Bliznykov; 21.02.2012 в 15:35.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.02.2012, 15:49   #7
PetrowD
 
Регистрация: 19.02.2012
Сообщений: 4
По умолчанию

Цитата:
это почему же?
Имел ввиду выходной массив string (т.к. некоторые символы порушат целостность строк как минимум и превратят в никомпилируемую билиберду)

Ваш вариант превращения в массив байт увеличил файл с 800 кб в 2.7 мб, что вообщем то в более чем 3 раза больше оригинала, соответственно отпадает как вариант, хотя и он уже был ранее рассмотрен

Цитата:
И чем Вас ресурсные файлы не устраивают? (если уж так категорически нельзя во внешних файлах держать данные)
Вариант с ресурсами отпадают.

И так мне видится несколько возможных вариантов. 1. это паковать входной буфер, и далее бэйсом64 по нему. 2. на базе функций base32 и base64 сконструировать свою функцию base128, которая увеличит файл по моим подсчетам так, как меня устроит.
Вопрос состоит в том, возможно кто-то уже реализовывал base128, чтобы не волосипедить заного ?
PetrowD вне форума Ответить с цитированием
Старый 21.02.2012, 16:20   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Ваш вариант превращения в массив байт увеличил файл с 800 кб в 2.7 мб, что вообщем то в более чем 3 раза больше оригинала, соответственно отпадает как вариант, хотя и он уже был ранее рассмотрен
никак не могу понять, чем Вас 4-х кратное увеличение не устраивает?!
Это же только в ИСХОДНОМ коде.
После компиляции получится тот же самый размер, что Вам нужен!

Цитата:
Имел ввиду выходной массив string (т.к. некоторые символы порушат целостность строк как минимум и превратят в никомпилируемую билиберду)
ну дались Вам эти строки!
Но я всё равно не понимаю, что Вы имеете в виду!
Потому как, если даже использовать строку и так записать:
Код:
const Fl : string = #0#2'dsaasda'#12#13#21'zx'#10#0;
то никакой "некомпилируемой" белиберды не получится..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.02.2012, 17:19   #9
Олвин
Экспериментатор
Форумчанин
 
Аватар для Олвин
 
Регистрация: 16.04.2008
Сообщений: 218
По умолчанию

Цитата:
Есть ли кодировки типа Base64, которые не увеличат размер генерируемого кода и чтобы кодированный массив был печатаемым?
Количество печатных символов меньше 256 (в восьмибитных кодировках). Каким образом кодировать остальные байты печатными символами, если вы хотите использовать по одному символу на байт? =)
Для создания сложных вещей не нужны сложные интерфейсы. (с) Линус Торвальдс
Олвин вне форума Ответить с цитированием
Старый 21.02.2012, 19:13   #10
GoodDA
фрилансер
Форумчанин
 
Аватар для GoodDA
 
Регистрация: 18.07.2008
Сообщений: 107
По умолчанию

Кроме ресурсов можно еще напрямую присоединить к экзешнику любой файл и потом читать его прямо из экзешника.
Есть готовый код по присоединению/чтению, искать по сочетанию Delphi joiner
GoodDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос по C++ tema65 Помощь студентам 3 30.12.2011 13:58
Вопрос по mySQL + Вопрос по RichEdit HTL Общие вопросы Delphi 4 01.01.2010 20:22
Соглашение о кодировании .NET SunKnight Общие вопросы .NET 3 08.11.2009 19:01
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10