2017-06-28 157 views
0

我不得不承認,我有點感到迷惘,很抱歉,如果這個問題心不是很清楚的或微不足道的(其實我希望是後者)....流數據轉化爲字節數組

我送在網絡字節數組,並希望做這樣的事情在發送方:

size_t max_size = 100; 
uint8_t buffer[size]; 
idontknowwhat_t x{buffer};  
uint16_t size = 11;     // total number of bytes in the buffer 
uint16_t id_a,id_b,id_c;   // some ids 
uint8_t a,b,c;      // some data 
x << size << id_a << a << id_b << b << id_c << c; 
someMethodToSend(buffer,size); 

,並在接收端是這樣的:

size_t max_size = 100; 
uint8_t buffer[size]; 
someMethodToReceive(buffer); 
idontknowwhat_t x{buffer}; 
uint16_t size; 
x >> size; 
for (uint16_t i=0; i<size-2; i++) { 
    uint16_t id; 
    uint8_t data; 
    x >> id >> data; 
    std::cout << id << " " << data; 
} 

所以我的目標是基本上可以避免醜陋的強制轉換和手動遞增指針,同時能夠在緩衝區中有uint8_tuint16_t(也可能有uint32_t)。我在這裏放入緩衝區的數據僅僅是一個例子,我知道在通過網絡發送時需要注意字節順序(如果我必須手動執行此操作,那將會很好)。

有什麼我可以用來代替我的假設idontknowwhat_t

+0

我認爲['boost :: asio :: streambuf'](http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/reference/streambuf.html)應該沒問題,但我不確定它使用的內部緩衝區是否適合您的用例。 – Rakete1111

+0

@ Rakete1111我想我已經看過它了,但在閱讀過很多關於流的不同地方後,我有些困惑。我會試一試,thx的提示 – user463035818

回答

1

你不能真的避免做醜陋的演員,但至少你可以隱藏他們到idontknowwhat_t職業的operator>>operator<<函數。使用模板,您可以將代碼中的強制轉換次數限制在最低限度。

class idontknowwhat_t 
{ 
    uint8_t* _data; 

public: 
    idontknowwhat_t(uint8_t* buffer) 
     : _data(buffer) 
    {} 

    template<typename insert_type> 
    idontknowwhat_t& operator<<(insert_type value) 
    { 
     *reinterpret_cast<insert_type*>(_data) = value; 
     _data += sizeof(insert_type); 
     return *this; 
    } 
    template<typename extract_type> 
    idontknowwhat_t& operator>>(extract_type& value) 
    { 
     value = *reinterpret_cast<extract_type*>(_data); 
     _data += sizeof(extract_type); 
     return *this; 
    } 
}; 

我認爲這將直接與您的代碼直接工作。在這個例子中,idontknowwhat_t類不擁有緩衝區,只是保留一個原始指針,指向它期望讀取或寫入的下一位數據。對於真實的目的,我建議讓idontknowwhat_t類管理緩衝存儲器。

另外,這個頁面上的代碼實際上並沒有處理數據的字節順序,這肯定是idontknowwhat_t類的責任。這是一個boost library。我不是在這裏記錄這個圖書館的用途,因爲我認爲它分散了真正的問題。

+0

這看起來很好。我非常肯定,我需要所有的boost類,但是我沒有設法採用[示例](http://www.boost.org/doc/libs/1_51_0/doc/html/booster_asio/tutorial/tutdaytime4 .html)我找到了我需要的東西。只要接收者事先知道接收它容易的內容,但是如果消息中的類型在消息本身中被編碼,那麼我就會迷失方向。順便說一句,這種類型的演員我不認爲是醜陋的,因爲它只限於幾行,並且調用者不會注意到它的存在 – user463035818

+0

Re「只要接收者事先知道接收它的容易,但如果消息中的類型在消息本身編碼,我很失落「。這與排列順序不同。 接收者必須知道它期望的內容 - 至少,它必須告訴'idontknowwhat_t'它希望返回值具有哪種數據類型。你能更具體地說明你想要達到的目標嗎? – Kessel

+0

確保註釋沒有關於字節順序。我的意思是這些消息不是一個固定的結構,而只是遵循一個固定的協議,例如。 (用例中的問題留)的一定值的'id'可能表明,未來值是'uint32_t'而另一個值可能表示下一個值是'uint16_t' – user463035818

0

你試過std::list?您可以將元素分組成不同的類型,並將它們放入適當類型的列表中。然後你可以創建一個std :: lists的std :: list。

+0

不,我不想在整個網絡上發送列表。我想發送一個字節數組,所以我不明白std :: list如何幫助 – user463035818