我有一个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