На стороне Python вы не указываете порядок байтов для вашего потока байтов. Так что это будет зависеть от машины, это может быть little-endian или big-endian . Это может привести к проблемам.
Вы можете принудительно отправить поток байтов, например, в little-endian :
conn.send(struct.pack("<I",10)) # added <
В C ++, вызвав sstr >> receivedInt
Вы выполняете форматированное чтение данных. Это может работать, если ваш поток содержит «10» в виде строки - 2 символа, но ваш поток содержит 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 с расширением немного знака, поэтому вы должны иметь выполнять побитовое И с надлежащими масками для обнуления большинства левых битов.