gpt4 book ai didi

c++ - 二进制通过http

转载 作者:太空狗 更新时间:2023-10-29 23:46:35 24 4
gpt4 key购买 nike

我正在使用 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),它被协议(protocol)使用。

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

谢谢。

最佳答案

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

 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 format spec ,第 2.1 节,整数字节顺序:PNG 使用净字节顺序,即 big字节序)

关于c++ - 二进制通过http,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10286132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com