С++/АТЛ. Лучшая практика объединения двоичных и текстовых данных

Мне нужно создать массив BYTE*, в котором будут храниться некоторые текстовые и двоичные данные для запроса Http. Что-то типа:

Content-Type: multipart/form-data; boundary=Asrf456BGe4h

--Asrf456BGe4h
Content-Disposition: form-data; name="DestAddress"
...
--Asrf456BGe4h
Content-Disposition: form-data; name="AttachedFile1"; filename="photo.jpg"
Content-Type: image/jpeg
...binary data... 

Я боюсь использовать стандартные строки atl, потому что они усекают мои двоичные файлы. Как бы вы соединили такие вещи? Я хотел бы запрограммировать так:

DynamicArray arr();
arr.Add("Content-Type ... ");
arr.Add(imgContent, imgContentSize);
arr.Add("Content-Type...");

BYTE* buf;
arr.GetBits(buf);

Наконец, у меня должен быть массив BYTE*. Какие классы ATL должны предоставить мне такую ​​функциональность?


person Andrew Florko    schedule 05.07.2011    source источник


Ответы (2)


Во-первых, вы можете поместить необработанные данные в std::string без риска возникновения каких-либо проблем. Это может смутить читателя, который ожидает, что std::string будет содержать текст, но в определенных случаях (и вставка необработанных данных в ответ HTTP может быть допустимым примером) это оправдано.

Во-вторых, я не уверен, что вы подразумеваете под «обрезать мои двоичные файлы». Если файл записывается и читается в двоичном режиме, проблем быть не должно; его точно нет в системах, с которыми я знаком (Unix и Windows).

Наконец, хотя я не уверен, как определяется BYTE (вероятно или, по крайней мере, надеюсь, что это unsigned char). В этом случае самым простым решением, вероятно, будет использование std::vector<BYTE> для создания буфера. Чтобы добавить к нему строку:

buffer.append( str.begin(), str.end() );

(Неявное преобразование char в unsigned char помогает здесь.)

person James Kanze    schedule 05.07.2011
comment
да, наконец, мой код имеет: строковые данные; данные.добавлять(..); data.append((char*)биты, размер); - person Andrew Florko; 07.07.2011

Я предполагаю, что вы используете MSVC? Я думаю, вы могли бы использовать класс std::rope для объединения ваших строк, он должен поставляться с вашим дистрибутивом STL. Эффективно объединять несколько строк.

Окончательный массив байтов можно получить с помощью c_str().

person Constantinius    schedule 05.07.2011
comment
Спасибо, я узнал, что std::string имеет все необходимые функции :) - person Andrew Florko; 07.07.2011