how*_*ith 5 c++ arrays 7-bit unions 8-bit
我有一个 100 的数组uint8_t,它被视为 800 位的流,并且一次处理 7 位。换句话说,如果 8 位数组的第一个元素成立0b11001100,第二个元素成立ob11110000,那么当我以 7 位格式读取它时,7 位数组的第一个元素将是0b1100110,第二个元素将0b0111100是其余 2 位保存在第 3 位中。我尝试的第一件事是工会...
struct uint7_t {
uint8_t i1:7;
};
union uint7_8_t {
uint8_t u8[100];
uint7_t u7[115];
};
Run Code Online (Sandbox Code Playgroud)
但当然,所有内容都是字节对齐的,我本质上最终只是丢失了每个元素的第 8 位。
有谁知道我该怎么做?
需要明确的是,这是联合结果的视觉表示:
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx8 位数据的 32 位
0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx7 位数据的 32 位。
这代表了我想做的事情:
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx8 位数据的 32 位
xxxxxxx xxxxxxx xxxxxxx xxxxxxx xxxx7 位数据的 32 位。
我知道最后的位可能会被填充,但这没关系,我只是想以某种方式一次访问每个字节 7 位,而不会丢失任何 800 位。到目前为止,我能想到的唯一方法是大量位移,这当然可行,但我确信有一种更干净的方法来解决它(?)
预先感谢您的任何答复。
这是一种无需手动换档的方法。这只是一个粗略的 POC,但希望您能够从中有所收获。我不知道您是否能够轻松地将输入转换为位集,但我认为这应该是可能的。
int bytes = 0x01234567;
bitset<32> bs(bytes);
cout << "Input: " << bs << endl;
for(int i = 0; i < 5; i++)
{
bitset<7> slice(bs.to_string().substr(i*7, 7));
cout << slice << endl;
}
Run Code Online (Sandbox Code Playgroud)
此外,这可能比位移版本的性能要差得多,所以我不推荐它用于繁重的工作。