我正在寻找一种高效且无未定义行为的方法,将std::vector<uint8_t>
转换为std::vector<uint64_t>
,使得 std::vector<uint64_t>
中的每个元素都包含来自 std::vector<uint8_t>
的8个元素的信息。剩余的元素应该填充为零,但这可以稍后完成。
目前我想到的最佳方法是:
std::vector<uint64_t> foo(std::vector<uint8_t> const & v8) {
std::vector<uint64_t> v64;
v64.reserve((v8.size() + 7) / 8);
size_t i = 0;
uint64_t tmp;
for(; i + 8 < v8.size(); i += 8) {
memcpy(&tmp, v8.data() + i, 8);
v64.push_back(tmp);
}
tmp = 0; // fill remainder with 0s.
memcpy(&tmp, v8.data() + i, v8.size() - i);
v64.push_back(tmp);
return v64;
}
但我希望有一种更干净/更好的方法。 编辑1:该解决方案存在字节顺序问题。@VainMain指出了这一点。 可以在
memcpy 之后进行字节交换来修复它。
{1, 2}
组成的两字节数组转换为uint16_t
时,你期望得到(1 << 8) | 2
还是(2 << 8) | 1
? - VainMan