二进制通过http

时间:2012-04-23 18:25:54

标签: c++ http binary http-post

我正在使用C ++发送带有二进制信息的post-request。代码如下:

int binary[4] = { 1, 2, 3, 4 };

std::stringstream out;
out << "POST /address HTTP/1.1\r\n";
out << "Host: localhost\r\n";
out << "Connection: Keep-Alive\r\n";
out << "Content-Type: application/octet-stream\r\n";
out << "Content-Transfer-Encoding: binary\r\n";
out << "Content-Length: " << 4*sizeof(int) << "\r\n\r\n";    // 4 elements of integer type

将数据发送到套接字中已打开的连接:

std::string headers = out.str();

socket.send(headers.c_str(), headers.size());  // Send headers first
socket.send(reinterpret_cast<char*>(&binary[0]), bufferLength*sizeof(int));  // And array of numbers

但有人告诉我,通过http协议发送纯字节是错误的。是对的吗?例如,我无法发送0(zero),它被协议使用。

如果这是正确的(因为我无法处理该请求并获取我发送的数据)我可以使用什么呢?也许,将数组转换为hex或base64url?

感谢。

3 个答案:

答案 0 :(得分:3)

通过HTTP发送二进制文件没有错。

这种情况一直伴随着图片文件上传

答案 1 :(得分:3)

  

但有人告诉我,通过http协议发送纯字节是   错误。是吗?

不,身体很好,具体取决于内容类型。 “Octet-stream”在这方面应该没问题,是的,它可以包含零字节。

答案 2 :(得分:3)

人们说错误的问题是关于字节序的问题。您当然可以使用http传输二进制数据,但是当另一端收到它们时,它必须能够正确地解释它们。我们假设您的机器是一台小端机器;你的整数将在内存中存储为(32位整数)

 01 00 00 00 
 02 00 00 00
 03 00 00 00
 04 00 00 00

你发送这16个字节,因为它们是#34;。现在,假设接收机器天真地获取数据,而不管它们是谁以及如何发送,并假设该机器是一个大端机器;在这样的机器中,1,2,3,4个内插的存储器布局将是

 00 00 00 01
 00 00 00 02
 00 00 00 03
 00 00 00 04

这意味着对于接收机器,第一个整数是0x01000000,而不是发送者想要的0x00000001。

如果你决定你的整数必须一直作为大端整数发送,那么如果发送者是一个小端的机器,它需要重新安排&#34;在发送之前正确整数。有一些功能,如hton*(主机到网络)&#34;转换&#34;主机32/16位整数到&#34;净字节顺序&#34;这是大端(反之,有ntoh* net to host)

请注意,数据不会被加扰,它们会被发送,因为它们是#34;,可以这么说。将它们存储在内存中的方式以及在阅读时解释它们的方式会有什么变化。通常它不是问题,因为数据是根据一种格式发送的,如果需要的话,它指定非单字节数据的字节序(例如参见PNG format spec,sec 2.1,整数字节顺序:PNG使用net byte order即big endian)