Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отделение текста от бинарника [D7]


ZGadget ©   (2007-12-04 01:38:00) 

Пишу HTTP клиент. Есть буффер в который загружаются данные с веб-сервера. Структура данных примерно такая:
текст_текст_текст_текс
...
[строка_разделитель (тоже текстовая)]
[двоичные данные]
...

[двоичные данные] - например картинка.
Пытаюсь отделить всё что идёт до [строка_разделитель] от того что идёт после неё. Весь день бился, ничего не помогает...
Вот, для наглядности, как у меня всё устроено:
 Buffer:Pointer;
 ...
 GetMem(Buffer,10240);
Нужто как-то отрезать часть, которая идёт до [строка_разделитель] вместе со строкой разделителем и записать обратно в буффер.


ZGadget   (2007-12-04 15:22:00) [1]

Так точно =) Туплю. Всем спасибо за советы.


Reindeer Moss Eater   (2007-12-04 15:15:00) [2]

Ну и зачем тебе указатель к массиву, доступ к элементам которого возможен по индексу, а смещение на длину текстовых данных известно?


ZGadget   (2007-12-04 15:09:00) [3]

Пока решил остановиться на array [0..10239] of char... что дальше пока не прохаваю....


Reindeer Moss Eater   (2007-12-04 15:04:00) [4]

Статический массив + указатель это конечно круто.
А попроще и менее извращенно не пробовал?
PByte + GetMem например?


ZGadget   (2007-12-04 14:55:00) [5]

Вот идея с Buffer:array [0..10239] of char; мне очень нравится. Сейчас туда-сюда вертел, никак не соображу как к нему смещение прибавить, чтобы отрезать всё что до разделителя...
Когда был Pointer, то я делал так Inc(Integer(Buffer),offset); но там сплошные проблемы с этой памятью... постоянно из-за чего-нибудь вылетает.


Reindeer Moss Eater   (2007-12-04 13:55:00) [6]

Именно к интегеру вовсе не обязательно.
Сойдет любой типизированный указатель. Хотя это конечно зависит от характера данных в самом буфере.


Anatoly Podgoretsky   (2007-12-04 13:51:00) [7]

Buffer надо приводить к Integer, прибавлять и потом обратно.
Не потеряй буфер.
10240 это такая маленькая величина, что проще буфер выделить статически как array [0..10239] of char и работать c PChar, тогда к нему можно прибавлять 100 и не надо заботиться об выделение и освобождение. Все плюсы статики.


Reindeer Moss Eater   (2007-12-04 13:49:00) [8]

Все читать в двоичный буфер.
Отделить заголовок через PChar
+ Отдельная переменная-указатель PByte нацеленная на байт после заголовка.
Исходный указатель сохранять для освобождения всего буфера.


ZGadget   (2007-12-04 13:25:00) [9]

Посоветовали просто указатель переместить на конец стоки-разделителя. Как это делается? например Buffer:=Buffer+100?


ZGadget   (2007-12-04 12:57:00) [10]

Ответ HTTP сервера не стандартный.
Найти позицию разделителя не составляет труда, тут действительно можно сначала привести тип к PChar, а вот как потом произвести отделение в буффере?


Reindeer Moss Eater   (2007-12-04 11:45:00) [11]

То есть просто в цикле делаем readln пока не прочитаем пустую строку.
Затем смотрим, есть ли там content-length и читаем уже двоичный буфер.
Все как учили в автошколе.


Reindeer Moss Eater   (2007-12-04 11:42:00) [12]

Я бы привел буфер к PChar и нашел бы разделитель.
Если конечно это не стандартный ответ http сервера где есть content-length и сздади присутствует двоичка.
Там такого изврата конечно же не потребуется.


Anatoly Podgoretsky   (2007-12-04 11:36:00) [13]

> Reindeer Moss Eater  (04.12.2007 11:25:04)  [4]

Ты уверен, что нет обращения к структуре строки?
Например к длине?
Я не стал бы рисковать, даже если в текущем генофонде этого и нет.


Anatoly Podgoretsky   (2007-12-04 11:26:00) [14]

> ZGadget  (04.12.2007 11:09:03)  [3]

Что то я не видел необходимости преобразования в PChar, не путаешь с Str... функциями?
Зато этим функциям требуется преобразование в string
Тут нужна функция Move или использовать в качестве буфера string, тогда их можно будет использовать и освобождать буфер не потребуеся.


Reindeer Moss Eater   (2007-12-04 11:25:00) [15]

текстовые данные идут впереди, позицию разделителя найти значит можно.
в том числе через Pos


ZGadget   (2007-12-04 11:09:00) [16]


> Германн

помоему этого должно хватить чтобы понять задачу.

> KilkennyCat

ммм для работы с pos и copy потребуется преобразование типа PChar(Buffer) и тогда потеряются двоичные данные... или я чего-то не понимаю?


KilkennyCat   (2007-12-04 03:24:00) [17]

copy, pos


Германн   (2007-12-04 02:03:00) [18]


> Вот, для наглядности, как у меня всё устроено:
>  Buffer:Pointer;
>  ...
>  GetMem(Buffer,10240);
>

И где тут "наглядность"?


Наверх

Титульная страница Поиск, карта сайта Написать письмо