gpt4 book ai didi

c++ - 使用 std::vector 的内容初始化结构

转载 作者:搜寻专家 更新时间:2023-10-31 01:43:50 25 4
gpt4 key购买 nike

这看起来应该是简单明了的事情,但谷歌却很少出现。

什么是初始化简单文件头结构的简洁、现代 (C++11) 方法,如下所示

typedef struct FooHeader {
uint8_t FooCount;
uint8_t BarCount;
uint32_t BazOffsets[4];
} FooHeader;

数据包含在 std::vector<unsigned char> 中?创建子 vector 并将其数据转换为 header 结构类型是个好主意,还是?

最佳答案

为避免遇到打包、对齐和字节序问题,最好在字节级别读取数据(在几乎所有现代硬件上,您可以假设为 8 位字节,但编译器之间的打包经常发生变化(甚至只是在不同的编译标志之间)以及大端和小端计算机仍然很常见)。

这意味着您最好的选择是:

FooHeader load_FooHeader(std::vector<unsigned char> const &dat) {
static_assert(
std::numeric_limits<unsigned char>::digits == 8,
"Assumes 8-bit bytes");

FooHeader retv;

retv.FooCount = dat[0];
retv.BarCount = dat[1];

//Start at the fifth byte, to allow for padding.
//If you want to use a packed format, use index = 2;
std::size_t index{4};
for (std::size_t i{0}, iend{4}; i < iend; ++i) {
retv.BarOffsets[i] = 0;
//Adjust ordering depending on desired endianness.
//Currently uses little endian.
for (std::size_t j{0}, jend{4}; j < jend; ++j) {
retv.BarOffsets[i] |= dat[index + i*4 + (3-j)] << (j*8);
}
}

return retv;
}

关于c++ - 使用 std::vector<unsigned char> 的内容初始化结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24470474/

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