gpt4 book ai didi

c++ - 从 std::vector 读取二进制数据的最简单方法?

转载 作者:太空狗 更新时间:2023-10-29 20:17:48 25 4
gpt4 key购买 nike

我有一堆二进制数据,格式为 const std::vector<unsigned char> ,并希望能够从中提取单个字段,例如整数的 4 个字节, bool 值的 1 个字节等。这需要尽可能高效和简单。例如。它应该能够在不需要复制数据的情况下读取数据(例如,复制到字符串或数组中)。而且它应该能够一次读取一个字段,就像解析器一样,因为数据 block 没有固定格式。我已经知道如何确定在每种情况下要读取的字段类型 - 问题是在 std::vector 之上获得一个可用的界面为此。

但是我找不到一种简单的方法来将这些数据转换成易于使用的形式,从而为我提供有用的读取功能。例如。 std::basic_istringstream<unsigned char>给了我一个阅读界面,但好像我需要将数据复制到临时 std::basic_string<unsigned char>首先,这不适用于更大的数据 block 。

也许在这种情况下我可以使用 streambuf 来就地读取数据,但看起来我需要派生我自己的 streambuf 类才能做到这一点。

我突然想到,我可能只对 vector 的 data() 使用 sscanf,这似乎比 C++ 标准库替代方案更简洁、更高效。 编辑:有被提醒 sscanf 并没有像我错误地认为的那样做,我实际上不知道用 C 或 C++ 做这件事的干净方法。但我是不是漏掉了什么,如果是,是什么?

最佳答案

您可以通过其operator[] 访问 vector 中的数据。 vector 的数据保证存储在单个连续数组中,[] 返回对该数组成员的引用。您可以直接或通过 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, &v[offset], 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);

关于c++ - 从 std::vector<unsigned char> 读取二进制数据的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5902360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com