2012-03-07 70 views
9

是否有類似std::streambuf的機制將多字節值轉換爲網絡字節順序?特別是,Boost Asio提供這樣一個原始?下面是我想流緩衝區做什麼的例子:是否有將主​​機轉換爲網絡字節順序的std :: streambuf版本?

uint64_t x = 42ull; 
network_streambuf b1; 
std::ostream os(&b1); 
os << 42ull; // htonll 

network_streambuf b2; 
std::istream is(&b2); 
uint64_t y; 
is >> y; // ntohll 

編輯:這些問題的答案表明,這是思考問題的錯誤方式:流緩衝區只提供給字符序列的訪問,他們的工作不是執行格式化的I/O或轉換。我可能會實現一個小緩衝區類,爲operator<<operator>>提供必要的重載以執行轉換。

+0

如果您在示例中定義了'b2',那麼您的問題會更有意義。另外,爲什麼'operator <<(...,unsigned long long)'調用'htons'?你不喜歡它調用'htonll'嗎? – 2012-03-07 17:24:36

+0

感謝羅布,我糾正了錯誤。 – mavam 2012-03-07 17:28:27

+3

我認爲你在錯誤的地方尋找解決方案。當格式化程序('ostream')完成時,它將一個字節流傳遞給'streambuf'。這聽起來像你實際上想要一個「二進制」'ostream',如果輸出數字的字節順序是你正試圖解決的問題。 – 2012-03-07 17:45:58

回答

7

不,我會告訴你爲什麼。

istream::operator>>ostream::operator<<對字符流進行操作,將它們從人類可讀形式轉換爲計算機的本機形式。除了提供(或接受)字符流之外,streambuf根本不參與該轉換。

換句話說,格式化的I/O例程從字符格式轉換爲二進制格式。

您正在詢問從一種二進制形式轉換爲另一種二進制形式。這不是一回事,並且stream格式化的文本例程是錯誤的地方。

這就是說,你可以創建自己的類實現operator<<operator>>,並有那些程序做網絡字節交換。

+1

但這是一種常見的模式,特別是在網絡中。有圖書館提供類似的服務嗎? – 2012-08-02 12:31:15

相關問題