Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.12.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
15-1196196390
gotik
2007-11-27 23:46
2007.12.30
Кто был в Тайланде?


1-1192066406
Dmitry S
2007-10-11 05:33
2007.12.30
OleVariant без автоматического подключения Variants


15-1196280766
TStas
2007-11-28 23:12
2007.12.30
Насколько вызовы ф-ций тормозят работу программы?


2-1196767896
Kolan
2007-12-04 14:31
2007.12.30
Как запретить авто удаление наследнику TInterfacedObject?


2-1196752097
allucard
2007-12-04 10:08
2007.12.30
Работа с записями





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский