簡體   English   中英

boost async_read_some讀取錯誤的緩沖區

[英]boost async_read_some reads wrong buffer

正在嘗試接收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數組轉換為十六進制:

#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錯了! 也許分配不好?!

那些ffffff錯了!

這是因為在您的平台上, char是帶符號的,因此字節值被視為帶符號的類型。 設置了最高位的任何值(例如第二個值84 )都將被視為負值,並且向int的轉換會將所有新位設置為1以保留負值。 這就是ffffff

一種選擇是在處理二進制數據的任何地方都使用unsigned char而不是char

另一種選擇是將其轉換為unsigned char而不是int以進行輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM