2013-06-21 107 views
4

我有一些代碼爲我提供了一個指向緩衝區的指針,以及我需要填充數據的緩衝區大小。我用一個boost::asio::mutable_buffer實例來表示這個緩衝區,但是我該如何正確使用這個緩衝區(例如,給它寫一個字符串,...)並且增強了強制緩衝區邊界?如何寫入boost :: asio :: mutable_buffer?

下面是一些僞代碼:

size_t some_callback(void *ptr, size_t) { 
    // this function is called by 3rd party 
    return our_handler(boost::asio::mutable_buffer(ptr, size)); 
} 

size_t our_handler(const boost::asio::mutable_buffer &buffer) 
{ 
    const std::string test("test"); 
    // How do I write this string into my buffer? 
    return test.size(); 
} 

回答

5

boost::asio::buffer_cast<>()是你應該用什麼來獲得訪問緩衝區使用的指針。 boost::asio::buffer_size()是你應該用來訪問使用的大小。

例如

const std::string test("test"); 
const size_t len = std::min(boost::asio::buffer_size(mybuf), test.length()); 
memcpy(boost::asio::buffer_cast<void *>(mybuf), 
    test.c_str(), 
    len); 
const std::string test2("test"); 
boost::asio::mutable_buffer offset = mybuf + len; 
const size_t len2 = std::min(boost::asio::buffer_size(offset), test2.length()); 
memcpy(boost::asio::buffer_cast<void *>(offset), 
    test.c_str(), 
    len2); 

boost::asio::mutable_buffer offset2 = offset + len2; 

參見:

+0

好吧,我知道了buffer_cast,但我認爲這種想法是推動通過一些方法來強制設置緩衝區邊界,但如果我自己執行memcpy,則由我來確保我不會超出範圍...... – Tom

+0

是的,請不要超出範圍。 ;) –

+0

好的一面,當你操縱緩衝區('operator +()')時,它會返回越來越小的緩衝區。完全理智的行爲! –