繁体   English   中英

如何将 Boost C++ 中接收到的字节转换为无符号整数和无符号整数向量

[英]How to convert received bytes in Boost C++ to a unsigned int and to a vector of unsigned int

我通过 Python TCP 套接字发送一个未签名的 integer 到用 Boost ZF6F097C9FDCF8B7323 编写的客户端我想知道如何将 Boost C++ 套接字中接收到的字节转换为无符号 integer。

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;

PS:C++ 客户端接收数据(4 字节),但我无法将其转换为 uint。

以及如何将字节转换为无符号整数向量?

先感谢您!

在 Python 方面,您没有为字节 stream 指定字节顺序。 所以这取决于机器,它可以是little-endianbig-endian 这可能会导致问题。

您可以强制字节 stream 以little-endian格式发送,例如:

conn.send(struct.pack("<I",10))    # added < 

在 C++ 中,通过调用sstr >> receivedInt执行格式化的数据读取。 如果您的 stream 将“10”作为字符串保存 - 2 个字符,但您的 stream 包含 4 个字节 - 10 的二进制表示为十进制,它可能会起作用。 您只需将所有字节的值合并到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());
uint32_t received = 
    (str[0] & 0xFF) 
  | (str[1] << 8) & 0xFF00 
  | (str[2] << 16) & 0xFF0000
  | (str[3] << 24);
std::cout << received << std::endl;  // 10 

数据以little-endian顺序发送,因此在将其合并为 uint32 数据时,必须像这样移动:

[str[3] | str[2] | str[1] | str[0]]

在将char通过扩展一点符号提升为int之前,您必须使用适当的掩码执行按位与运算,将最左边的位设为零。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM