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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2012, 20:46   #1
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию Обрезать бинарник

Доброго времени суток. Столкнулся с такой проблемой:
Подскажите пожалуйста как вырезать из бинарного файла (его дамп по ссылке- http://image.openlan.ru/images/76164901642021320134.jpg)
то что находится между 7f9 (Начало файла после заголовка ответа сервера) и концом файла, потом сохранить это в другой файл.

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
st:string;
ss,s,reply: String;
 StringList1:TStringList;
 responseCompressed:boolean;
begin
StringList1:= TStringList.Create;
StringList1.Clear;

    IdHTTP1.Request.AcceptEncoding := 'gzip,deflate';
    s := IdHTTP1.Get('http://ya.ru');

SaveFileFromStr(s,'source.txt');


    responseCompressed := Pos('gzip', lowercase(IdHTTP1.Response.ContentEncoding)) > 0;
    if responseCompressed then begin s := GZDecompressStr(s);
SaveFileFromStr(s,'decoded.txt');
 end;
- так сохраняю через функцию:

Код:
 
function SaveFileFromStr(const SrcStr,FilePath: AnsiString): Boolean;
var
   FS: TFileStream;
begin
   Result := False;
   FS := TFileStream.Create(FilePath,fmCreate);
   try
     FS.Write(SrcStr[1],Length(SrcStr));
     Result := True;
   finally
     FS.Free;
    end;
end;
Нужно его обработать (прочитать, обрезать начало и сохранить).
Убрать сжатие GZIP (строку IdHTTP1.Request.AcceptEncoding := 'gzip,deflate';) - не предлагайте, интересует именно экономия трафика, но делаю это через сторонние компоненты, поэтому ищу свой вариант.
Спасибо всем за внимание к посту, и большое спасибо всем ответившим.

Последний раз редактировалось denis76560; 11.09.2012 в 20:59. Причина: ошибка в коде
denis76560 вне форума Ответить с цитированием
Старый 11.09.2012, 21:15   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

я один не понял, что хочет ТС?
Во первых если вы 100% уверены в том, что сервер ответит GZIP то его надо сохранять никак не в строку, а в TSream т.к. из строки просто выпадет часть GZIP данных и все пойдет коту под хвост. Потом пишите стрим в файл.
В третьих, в ответе Get|Post нет HTTP заголовка ответа сервера, только данные.
Человек_Борща вне форума Ответить с цитированием
Старый 11.09.2012, 21:36   #3
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию

проблема в том что сервант может и на мой реквест IdHTTP1.Request.AcceptEncoding := 'gzip,deflate';
ответиль не сжатым контетом, поэтому и проверяю наличие в заголовке ответа сервера. В этом случае пытаюсь его сохранить в файл, но вся проблема в том что он сохраняет не сам контент ответа а сохраняет его вместе с заголовком сервера. Мне самое главное - отрезать сервантовский заголовок. по этой теме нашел - http://www.delphimaster.net/view/1-1193526029 (последний пост этой темы), но вся трабла в том что, даже имея в файле сохраненный ответ сервера с его заголовком, я не могу его правильно загрузить в переменную Ansistring... Там в сохраненном файле бинарник, как не пытался - не получается..

Последний раз редактировалось denis76560; 11.09.2012 в 21:38. Причина: ошибка
denis76560 вне форума Ответить с цитированием
Старый 12.09.2012, 09:29   #4
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Что бы избавиться от сжатия можно сделать так IdHTTP1.Request.AcceptEncoding := 'text/html'; и еще проверяйте на разделитель заголовка в HTTP это #13#10#13#10 обрабатываете полученное на этот разделитель.

простенький примерчик
подправил вашу функцию

Код:
function SaveFileFromStr(const SrcStr,FilePath: AnsiString): Boolean;
var
   FS: TFileStream;
   i: integer;
begin
Result := False;
   FS := TFileStream.Create(FilePath,fmCreate);
   try
  // ищем разделитель
    i:=pos(#13#10#13#10, SrcStr);
    if i<>0 then
    inc(i,4)
    else
    inc(i);

    FS.Write(SrcStr[i],Length(SrcStr)-i);
     Result := True;
   finally
     FS.Free;
    end;
end;;

Последний раз редактировалось Aliens_wolfs; 13.09.2012 в 09:18.
Aliens_wolfs вне форума Ответить с цитированием
Старый 16.09.2012, 20:59   #5
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию

решено, всем спасибо.
denis76560 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Записать бинарник из строки Unconnected Общие вопросы Delphi 21 12.07.2011 17:02
компиляция в чистый бинарник Hell Knight Общие вопросы C/C++ 5 23.03.2011 19:50
файловый поток. Открыть\создать бинарник Darth.Vader Общие вопросы C/C++ 16 29.12.2009 22:04
txt в бинарник и обратно cowboy Общие вопросы Delphi 9 16.09.2009 10:54
Как выяснить каким образом обрабатывается бинарник yarilo Помощь студентам 1 22.04.2009 09:57