2

我正在使用 C++ 发送带有二进制信息的后请求。代码如下所示:

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-protocol 发送纯字节是错误的。是对的吗?例如,我不能发送 0 ( zero),它是由协议使用的。

如果那是正确的(因为我无法处理该后请求并获取我发送的数据)我可以使用什么来代替?也许,将数组转换为十六进制或 base64url?

谢谢。

4

3 回答 3

3

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

图像文件上传时常发生这种情况

于 2012-04-23T18:30:27.467 回答
3

但有人告诉我,通过 http-protocol 发送纯字节是错误的。是对的吗?

不,在 body中很好,当然取决于 Content-Type 。“八位流”在这方面应该没问题,是的,它可以包含零字节。

于 2012-04-23T18:35:10.453 回答
3

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

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

并且您按“原样”发送这 16 个字节。现在,假设接收机器天真地获取数据,不考虑发送者和发送方式,并假设该机器是大端机器;在这样的机器中,1、2、3、4 整数的内存布局将是

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

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

如果您决定必须始终将整数作为大端整数发送,那么如果发送方是小端机器,则需要在发送前正确“重新排列”整数。有像hton*(主机到网络)这样的功能,可以将主机 32/16 位整数“转换”为大端的“网络字节顺序”(反之亦然,ntoh*网络到主机)

请注意,数据不会被加扰,它们是按“原样”发送的,可以这么说。改变的是你将它们存储在内存中的方式,以及你在阅读时解释它们的方式。通常这不是问题,因为数据是根据一种格式发送的,如果需要,该格式指定非单字节数据的字节顺序(例如,参见PNG 格式规范,第 2.1 节,整数字节顺序:PNG 使用净字节顺序,即大字节序)

于 2012-04-23T19:09:59.560 回答