Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.30;
Скачать: CL | DM;

Вниз

Отделение текста от бинарника   Найти похожие ветки 

 
ZGadget   (2007-12-04 01:38) [0]

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

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


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


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

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


 
KilkennyCat ©   (2007-12-04 03:24) [2]

copy, pos


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


> Германн

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

> KilkennyCat

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


 
Reindeer Moss Eater ©   (2007-12-04 11:25) [4]

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


 
Anatoly Podgoretsky ©   (2007-12-04 11:26) [5]

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

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


 
Anatoly Podgoretsky ©   (2007-12-04 11:36) [6]

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

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


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

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


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

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


 
ZGadget   (2007-12-04 12:57) [9]

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


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

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


 
Reindeer Moss Eater ©   (2007-12-04 13:49) [11]

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


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

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


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

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


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

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


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

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


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

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


 
Reindeer Moss Eater ©   (2007-12-04 15:15) [17]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2007.12.30;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
15-1196334922
xayam
2007-11-29 14:15
2007.12.30
помогите перевести с английского


2-1196762672
Леони
2007-12-04 13:04
2007.12.30
SQL и Delphi


15-1196164673
shark
2007-11-27 14:57
2007.12.30
Вопрос по 3D эффекты.


15-1196316970
DaniilG
2007-11-29 09:16
2007.12.30
Turbo Delphi +Event Log


2-1196846087
slavon
2007-12-05 12:14
2007.12.30
Компонент типа "проводника"