c – 从std :: vector读取二进制数据的最简单方法?
发布时间:2020-12-16 09:34:34 所属栏目:百科 来源:网络整理
导读:我有一个const std :: vector unsigned char形式的二进制数据块,并且希望能够从中提取单个字段,例如4个字节表示整数,1表示布尔值等.这需要尽可能高效和简单.例如.它应该能够在不需要复制数据的情况下读取数据(例如,将其复制到字符串或数组中).它应该能够一次
我有一个const std :: vector< unsigned char>形式的二进制数据块,并且希望能够从中提取单个字段,例如4个字节表示整数,1表示布尔值等.这需要尽可能高效和简单.例如.它应该能够在不需要复制数据的情况下读取数据(例如,将其复制到字符串或数组中).它应该能够一次读取一个字段,就像解析器一样,因为数据块没有固定的格式.我已经知道如何确定在每种情况下要读取的字段类型 – 问题是在std :: vector之上获得一个可用的接口来执行此操作.
但是我找不到一种简单的方法来将这些数据转换成一个易于使用的形式,从而为我提供有用的读取功能.例如. std :: basic_istringstream< unsigned char>给了我一个阅读界面,但似乎我需要将数据复制到一个临时的std :: basic_string< unsigned char>首先,这不是更大的数据块的想法. 也许有一些方法我可以在这种情况下使用streambuf来读取数据,但看起来我需要派生自己的streambuf类来做到这一点. 在我看来,我可能只是在vector的data()上使用sscanf,这似乎比C标准库替代品更简洁,更有效.编辑:有人提醒我sscanf没有做我错误认为的事情,我实际上不知道在C或C中这样做的干净方法.但我错过了什么,如果是的话,那是什么? 解决方法
您可以通过其operator []访问向量中的数据.保证向量的数据存储在单个连续数组中,[]返回对该数组成员的引用.您可以直接使用该引用,也可以通过memcpy使用该引用.
std::vector<unsigned char> v; ... byteField = v[12]; memcpy(&intField,&v[13],sizeof intField); memcpy(charArray,&v[20],lengthOfCharArray); 编辑1: template <class T> ReadFromVector(T& t,std::size_t offset,const std::vector<unsigned char>& v) { memcpy(&t,&v[offset],sizeof(T)); } 用法是: std::vector<unsigned char> v; ... char c; int i; uint64_t ull; ReadFromVector(c,17,v); ReadFromVector(i,99,v); ReadFromVector(ull,43,v); 编辑2: struct Reader { const std::vector<unsigned char>& v; std::size_t offset; Reader(const std::vector<unsigned char>& v) : v(v),offset() {} template <class T> Reader& operator>>(T&t) { memcpy(&t,sizeof t); offset += sizeof t; return *this; } void operator+=(int i) { offset += i }; char *getStringPointer() { return &v[offset]; } }; 用法: std::vector<unsigned char> v; Reader r(v); int i; uint64_t ull; r >> i >> ull; char *companyName = r.getStringPointer(); r += strlen(companyName); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |