如何在Boost C++;到无符号整数和到无符号整数的向量 我通过Python TCP套接字发送一个无符号整数给在Boost C++中写入的客户端。 我想知道如何将升压C++套接字中的接收字节转换成无符号整数。
Python套接字服务器如何在Boost C++;到无符号整数和到无符号整数的向量 我通过Python TCP套接字发送一个无符号整数给在Boost C++中写入的客户端。 我想知道如何将升压C++套接字中的接收字节转换成无符号整数。,python,c++,sockets,boost,data-conversion,Python,C++,Sockets,Boost,Data Conversion,Python套接字服务器 import socket import struct with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) s.listen() print("listening..") conn, addr = s.accept() with conn: print('Connected by', addr)
import socket
import struct
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
print("listening..")
conn, addr = s.accept()
with conn:
print('Connected by', addr)
# SENDING 10 AS AN UNSIGNED INTEGER
conn.send(struct.pack("I",10))
C++增强客户端套接字
#include <boost/asio/local/stream_protocol.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/asio/buffer.hpp>
#include <boost/asio.hpp>
#include <boost/system/error_code.hpp>
using namespace std;
// CREATE SOCKET
boost::asio::io_service io_context;
boost::asio::streambuf sb;
boost::system::error_code ec;
boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"), 10000);
boost::asio::ip::tcp::socket socket(io_context);
socket.connect(ep);
// READ 4 BYTES
boost::asio::read(objSocket, sb,boost::asio::transfer_exactly(4), ec))
cout << "\nreceived: '" << &sb << "'\n";
// CONVERT 4 BYTES TO UNSIGNED INT
boost::asio::streambuf::const_buffers_type bufs = sb.data();
string str(boost::asio::buffers_begin(bufs), boost::asio::buffers_begin(bufs) + sb.size());
sb.consume(sb.size());
std::stringstream sstr(str);
unsigned int receivedInt = 0;
sstr >> receivedInt;
cout << "\nReceivedInt: "<< length;
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
//创建套接字
boost::asio::io_服务io_上下文;
boost::asio::streambuf sb;
boost::system::error_code ec;
boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string(“127.0.0.1”),10000);
boost::asio::ip::tcp::socket套接字(io\U上下文);
插座连接(ep);
//读取4个字节
boost::asio::read(objSocket,sb,boost::asio::transfer_恰好(4),ec))
cout在Python端,您没有为字节流指定字节顺序。因此,它将取决于机器,它可以是小端或大端。这可能会导致问题
您可以通过以下方式强制发送字节流,例如在little endian中:
数据以小尾端顺序发送,因此在将其合并到uint32中时,数据必须按如下方式移动:
[str[3] | str[2] | str[1] | str[0]]
在将字符移位为int之前,需要扩展一个符号位,因此必须按位执行,并使用适当的掩码将最左边的位置零 谢谢你的回答,我刚刚尝试了你的解决方案,当我发送struct.pack时(“很好,非常感谢,它成功了!你能简单地解释一下为什么我们要从缓冲区转换到字符串到整数。有没有一种方法可以直接从缓冲区转换到整数?@Hangon最简单的方法是定义uint32\u t received
,然后为这个整数创建一个缓冲区:boost::asio::read”(socket,boost::asio::buffer(&received,4),ec);
就足够了。4个字节将直接读入接收的。但在这种情况下,您必须处理小/大端。对于大端接收的,字节应该反转。
boost::asio::streambuf::const_buffers_type bufs = sb.data();
string str(boost::asio::buffers_begin(bufs), boost::asio::buffers_begin(bufs) + sb.size());
sb.consume(sb.size());
uint32_t received =
(str[0] & 0xFF)
| (str[1] << 8) & 0xFF00
| (str[2] << 16) & 0xFF0000
| (str[3] << 24);
std::cout << received << std::endl; // 10
[str[3] | str[2] | str[1] | str[0]]