一次从数组读取两个字节?

时间:2017-09-19 16:06:40

标签: c arrays loops byte

我宣布一个数组

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...]

这可能吗?

3 个答案:

答案 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);
}