如何在Boost C++;到无符号整数和到无符号整数的向量 我通过Python TCP套接字发送一个无符号整数给在Boost C++中写入的客户端。 我想知道如何将升压C++套接字中的接收字节转换成无符号整数。

如何在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)

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)

        # 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]]