2013-09-13 3 views
0

пытается получить к queue->buffer где queue->buffer является char * buffer = new char[1024]подталкивание async_read_some читает неправильный буфер

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)); 
} 

и уверен, преобразование массива байт в шестнадцатеричном с помощью этого метода: -

#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 

, который является wro ng те ffffff ошибается! может быть, какое-то плохое распределение ?!

ответ

0

это неправильный те ffffff неправ!

Это потому, что на вашей платформе подписан char и поэтому значения байтов обрабатываются как подписанные типы. Любое значение с установленным верхним битом (например, второе значение, 84) будет считаться отрицательным, и преобразование в int будет устанавливать все новые биты в 1 для сохранения отрицательного значения. Это дает ffffff.

Один из вариантов заключается в использовании unsigned char, а не char везде, где вы имеете дело с двоичными данными.

Другим вариантом является преобразование в unsigned char, а не int для вывода.

Смежные вопросы