C ++ / ATL。连接二进制和文本数据的最佳实践

时间:2011-07-05 09:11:30

标签: c++ atl

我必须创建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课程应该为我提供这样的功能?

2 个答案:

答案 0 :(得分:1)

首先,您可以将原始数据放入std::string,而不会出现任何问题。它可能会使读者感到困惑,他希望std::string包含文本,但在特定情况下(将原始数据插入HTTP响应可能是一个有效的例子),这是合理的。

对于第二个,我不确定你的意思是“截断我的二进制文件”。如果以二进制模式写入和读取文件,则应该没有问题;肯定没有我熟悉的系统(Unix和Windows)。

最后,虽然我不确定BYTE是如何定义的(可能 - 或者至少是有希望的 - ,它是unsigned char)。在这种情况下,最简单的解决方案可能是使用std::vector<BYTE>来构建缓冲区。要附加一个字符串:

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

charunsigned char的隐式转换可以解决问题。)

答案 1 :(得分:1)

我假设您使用的是MSVC?我想你可以使用std::rope类来连接你的字符串,它应该附带你的STL分发。连接多个字符串是有效的。

可以使用c_str()检索最终的字节数组。