我有一個const std::vector<unsigned char>
的形式的二進制數據塊,並希望能夠從中提取單個字段,例如4個字節的整數,1個布爾值等。這需要,儘可能可能的,既有效又簡單。例如。它應該能夠在不需要複製的情況下就地讀取數據(例如,寫入字符串或數組)。它應該能夠一次讀取一個字段,就像解析器一樣,因爲數據塊沒有固定的格式。我已經知道如何確定在每種情況下要讀取的字段類型 - 問題是在std::vector
之上獲得可用的接口來完成此操作。從std :: vector讀取二進制數據的最簡單方法<unsigned char>?
但是我找不到一個簡單的方法將這些數據轉化爲一種易於使用的形式,它提供了有用的讀取功能。例如。 std::basic_istringstream<unsigned char>
給了我一個閱讀界面,但似乎我需要先將數據複製到臨時std::basic_string<unsigned char>
,這對於更大的數據塊來說並不是一個好主意。
也許有一些方法可以在這種情況下使用streambuf來讀取數據,但似乎我需要派生自己的streambuf類來做到這一點。
在我看來,我可能只是對向量的data()使用sscanf,並且這似乎比C++標準庫替代方案更簡潔和更有效。
編輯:有人提醒說,sscanf不會做我誤以爲它做了什麼,我其實不知道乾淨的方式來做這個在C或C++。但我錯過了什麼,如果是的話,什麼?
您可以使用'std :: string'和'data()'方法。您可以使用您的按位運算符而無需複製任何內容。 – GWW 2011-05-05 18:24:28
數據不會以std :: string的形式到達。我不確定你指的是哪個按位運算符 - 我需要按順序讀取字節。 – Kylotan 2011-05-05 18:26:13
我很困惑你的衝突的要求。你說你有「一大堆二進制數據」,但你說你可以「可能只是使用sscanf」。 'scanf'讀取文本格式的數據,而不是二進制格式的數據。讓我這樣說:如果你的向量有一個int,它將被存儲爲一個32位的四字節2的補碼數組,或者被存儲爲幾個字符,每個字符的範圍是0-9? – 2011-05-05 19:28:43