我宣布一个数组
uint8_t data_buffer[64];
我写进去,然后我需要迭代它查看它存储的数据。数据分为两组。
现在我正在做像这样凌乱的事情
for(int i = 1; i < BUFFER_LEN + 1; i += 2)
{
if(data_buffer[i] == 0xff && data_buffer[i+1] == 0xff)
{
write_led_states(i/2 + 1, OFF);
}
else
{
write_led_states(i/2 + 1, ON);
}
}
但是我更喜欢能够从缓冲区一次读取两个字节的数据,所以我可以做更多这样的事情:
for(int i = 1; i < BUFFER_LEN + 1; i++)
{
if(data_buffer[i] == 0xffff) // where data_buffer is being read two bytes at a time
{
write_led_states(i, OFF);
}
else
{
write_led_states(i, ON);
}
}
另一种表达我想做的事情的方法是重新映射索引,使它们看起来像这样:
[1][2][3][4][5][6][7][8]
喜欢这个:
[1...][2...][3...][4...]
这可能吗?
答案 0 :(得分:2)
改变这个:
uint8_t data_buffer[64];
到此:
uint16_t data_buffer[32];
uint_16_t
每个元素使用2个字节(16位)(并将大小调整为64的一半)。
PS:您的代码似乎访问了一个超出范围的数组,这里调用 Undefined Behavior ,在这里:
for(int i = 1; i < BUFFER_LEN + 1; i += 2)
数组索引从0开始,所以这应该从0开始,条件应该是i < BUFFER_LEN
。
然而,使用我的appraoch,你不需要增加2,所以你只需要执行一个干净的for循环,如下所示:
for(int i = 0; i < BUFFER_LEN; ++i)
答案 1 :(得分:1)
只需使用uint16_t
,即每个元素2个字节,
uint16_t data_buffer[32];
如果可能出现问题,请小心使用字节顺序。
注意:您似乎不知道数组是否为0索引,所以
for (int i = 1; i < BUFFER_LEN + 1; i += 2)
应该是(很可能是),
for (int i = 0; i < BUFFER_LEN; i += 2)
如果你按照我的建议行事,那么每个元素都是2个字节,所以你需要一半的元素,当然你会把i
增加1个
for (int i = 0; i < BUFFER_LEN; ++i)
答案 2 :(得分:0)
您可以通过bhtshifting将两个uint8_t
元素合并为一个uint16_t
:
for (int i = 1; i < BUFFER_LEN + 1; i += 2) {
uint16_t pair = data_buffer[i] << 8 | data_buffer[i+1];
LEDState newLEDState = (pair == 0xffff) ? OFF : ON; // replace "LEDState" with the proper type
write_led_states(i/2 + 1, newLEDState);
}