gpt4 book ai didi

c++ - 如何与数组合并并保持可移植性?

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

我正在尝试从字节数组中提取一系列 5 位数据 block ;或者,本质上,读取一个字节数组,就好像它是一个 5 位 block 的数组一样。下面是这个想法的一个例子:

enter image description here

由于 5 位和 8 位的最小公倍数是 40 位,我创建了一个由 8 个 5 位 block 和一个 5 元素字节数组组成的 union ,如下所示:

union Converter {
struct {
uint32_t chunk0 : 5;
uint32_t chunk1 : 5;
uint32_t chunk2 : 5;
uint32_t chunk3 : 5;
uint32_t chunk4 : 5;
uint32_t chunk5 : 5;
uint32_t chunk6 : 5;
uint32_t chunk7 : 5;
} __attribute__((packed));
struct {
uint8_t bytes[5];
};
};

请注意,每个 block 的值稍后将存储在一个 32 位无符号整数中,因此 uint32_t 用于在转换器中存储每个 block 的值。这种技术背后的想法是,我可以简单地从第一个结构中读取每个 block 的值并获得关联的 block 值。为了将字节数组分配给 union ,我使用了以下内容:

// Create an array of values
uint8_t someArray[5] = {0xff, 0xff, 0xff, 0xff, 0xff};

// Create a coverter
Converter converter;

// Copy the byte array into the converter
std::memcpy(converter.bytes, someArray, 5);

然后 block 值将被读取如下:

std::cout << "Chunk 0: " << converter.chunk0 << std::endl;
std::cout << "Chunk 1: " << converter.chunk1 << std::endl;
std::cout << "Chunk 2: " << converter.chunk2 << std::endl;
// Continue to the remaining chunks...

问题出现在最后一个 block 的值上:每个 0-6 block 的计算结果都是 31,这是正确的,但最后一个 block 的计算结果是 7 .相反,它应该是 31。查看内存(注意:我使用的是 x64 机器,因此是 little-endian),我看到以下值:

Address           0 - 3     4 - 7     8 - B     C - F               
000000000024FE20 FFFFFFFF FF000000 49194000 00000000

有趣的是,如果我将前两个内存块(一个 block 是一个 4 字节组)的值更改为 FFFFFFFF FF010000(将第二个组从 FF000000FF010000),最后一个 block 的值从 7 变为 15。为了获得最后一个 block 的 31 的值,必须将这两个 block 设置为 FFFFFFFF FF070000

由于 5 个字节和 8 个 5 位 block 应该直接重叠,假设没有填充,我在我的实现中错在哪里?在这种特殊情况下,我只能使用 C++98 并试图实现最大效率。

最佳答案

C++ 中的位域格式不保证没有填充。它可能拒绝使用您的编译器将您的五位 block 拆分为两个 32 位整数。

您需要编写自己的 unmangler。

关于c++ - 如何与数组合并并保持可移植性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33973858/

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