Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 位扩展字节数组_C++_C_Algorithm_Bit Manipulation_Bytearray - Fatal编程技术网

C++ 位扩展字节数组

C++ 位扩展字节数组,c++,c,algorithm,bit-manipulation,bytearray,C++,C,Algorithm,Bit Manipulation,Bytearray,我需要将动态大小的字节数组放大3 例如: 10101010 11001100 到 我使用了这里的算法来生成一个查找表 我已经尝试使用LUT to memcpy循环通过字节数组,将前3个字节循环到新数组。然而,我的输出看起来从来都不正确 有人对如何有效地实施这一点有什么建议吗?这将在嵌入式ARM处理器上运行 编辑 LUT试验 uint8_t msg[] = { 0xaa, 0x02, 0x43, 0x5a, 0x8d, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0

我需要将动态大小的字节数组放大3

例如:

10101010 11001100

我使用了这里的算法来生成一个查找表

我已经尝试使用LUT to memcpy循环通过字节数组,将前3个字节循环到新数组。然而,我的输出看起来从来都不正确

有人对如何有效地实施这一点有什么建议吗?这将在嵌入式ARM处理器上运行

编辑 LUT试验

uint8_t msg[] = { 0xaa, 0x02, 0x43, 0x5a, 0x8d, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x84, 0xc6, 0x2d, 0x00, 0xb9 };

uint8_t expanded_msg[63] = { 0 };
uint8_t tmp_val = 0;
uint32_t lut_val;
for (int i = 0; i < 21; i++)
{
    tmp_val = *(uint8_t*)(&msg + i);
    lut_val = bitExpandTable[tmp_val];
    memcpy(&expanded_msg[(i * 3)], &lut_val, 3);
}

print_binary(&msg, 21);
print_binary(&expanded_msg, sizeof(expanded_msg));

您的表(或如何复制数据)存在字节顺序问题:

对于第一个输入字节

10101010
您的输出是

a        b        c
00111000 10001110 11100011
但应该是

c        b        a
11100011 10001110 00111000
因此,第1和第3字节需要交换(依此类推)

我不想改变桌子来适应memcpy,我只想

int j = 0;
for (int i = 0; i < 21; i++) {
  lut_val = bitExpandTable[msg[i]];
  expanded_msg[j++] = (uint8_t) (lut_val >> 16);
  expanded_msg[j++] = (uint8_t) (lut_val >> 8);
  expanded_msg[j++] = (uint8_t) lut_val;
}
intj=0;
对于(int i=0;i<21;i++){
lut_val=位扩展表[msg[i]];
扩展消息[j++]=(uint8_t)(lut_val>>16);
扩展的消息[j++]=(uint8\u t)(lut\u val>>8);
扩展消息[j++]=(uint8_t)lut_val;
}

如果我理解正确,您想将原始数组中的每一位重复三次吗?是的,原始数组中的每一位都需要重复三次。向我们展示您尝试的内容,以及输入、预期输出和实际输出。将每一位推过一个函数,该函数在其缓冲区中有8、32个值时写入输出。然后冲洗任何没有写的东西。您不需要查找表。我添加了我的LUT测试及其输出。
b
开头的单个位在
a
c
被替换为不起作用时是正确的。颠倒追加字节的顺序确实有效(16,8,0)是的,很抱歉我最初也交换了值。。。现在应该修好了。。或者你看到了不同的问题吗?@WeatherVane 8位扩展到24位=3字节。查找表将每个可能的字节值扩展为相应的3个字节,存储在int中。感谢您的帮助。该系统现在按预期工作。
a        b        c
00111000 10001110 11100011
c        b        a
11100011 10001110 00111000
int j = 0;
for (int i = 0; i < 21; i++) {
  lut_val = bitExpandTable[msg[i]];
  expanded_msg[j++] = (uint8_t) (lut_val >> 16);
  expanded_msg[j++] = (uint8_t) (lut_val >> 8);
  expanded_msg[j++] = (uint8_t) lut_val;
}