boost async_read_some读取错误的缓冲区

时间:2013-09-13 16:27:17

标签: c++ memory-management asynchronous boost-asio

我正在尝试接收到queue->buffer,其中queue->bufferchar * buffer = new char[1024]

void AsyncConnection::BeginReceive(){

    m_socket.async_read_some(boost::asio::buffer(&queue->GetBuffer()[queue->GetOffset()], queue->GetBufferLength() - queue->GetOffset()), boost::bind(&AsyncConnection::EndReceive, shared_from_this(),
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred));
}

并使用此方法将bytes数组转换为hex: -

#include <iomanip>
void output_hex(std::ostream& out, char* buf, int len) {
    for (int i = 0; i < len; i++)
        out << std::noshowbase
        << std::hex
        << std::setfill('0')
        << std::setw(2)
        << static_cast<int> (buf[i])
        << " ";
    out << std::dec << std::endl;
}

输出如下: -

17 ffffff84 04 65 ffffff83 45 fffffff3 ffffffe2 ffffffdf 0f 33 ffffffa5 14 fffff
fcb 75 6f 5f ffffff89 ffffffb0 22 27 fffffffe ffffffeb fffffff2 ffffffef ffffffe
8 53 40 ffffffbe 18 ffffffa6 ffffff84 67 53 33 ffffffd6 ffffffa6 16 ffffff81 fff
fffe0 ffffffd9 05 35 ffffffab 16 ffffffc1 7f 6d 59 ffffff87 ffffffba 20

ffffff错误的错误!也许有某种不好的分配?!

1 个答案:

答案 0 :(得分:0)

  

ffffff错误的错误!

这是因为,在您的平台上,char已签名,因此字节值被视为签名类型。设置最高位的任何值(例如第二个值84)都将被视为负值,转换为int会将所有新位设置为1以保留负值。这给出了ffffff

一种选择是在处理二进制数据的任何地方使用unsigned char而不是char

另一种选择是转换为unsigned char而不是int来输出。