2 votes

Lire dans un tableau deux octets à la fois ?

Je déclare un tableau

uint8_t data_buffer[64];

J'écris dedans, et ensuite je dois itérer dessus en regardant les données qu'il stocke. Les données sont écrites par groupes de deux.

En ce moment, je fais quelque chose de désordonné comme ceci

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

Mais je préférerais de loin pouvoir lire deux octets de données à la fois à partir du tampon afin de pouvoir faire quelque chose comme ceci :

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

Une autre façon de dire ce que je veux faire est de remapper les indices pour qu'ils ressemblent à ceci :

[1][2][3][4][5][6][7][8]

pour aimer ça :

[1...][2...][3...][4...]

Est-ce possible ?

2voto

gsamaras Points 9567

Changez ça :

uint8_t data_buffer[64];

à ça :

uint16_t data_buffer[32];

uint_16_t utilise 2 octets (16 bits) par élément (et ajuste la taille à la moitié de 64).


PS : Votre code semble accéder à un tableau en dehors des limites, ce qui provoque l'invocation de Comportement indéfini ici :

for(int i = 1; i < BUFFER_LEN + 1; i += 2)

L'indexation des tableaux commence à partir de 0, donc cela devrait commencer à partir de 0 et la condition devrait être i < BUFFER_LEN .

Cependant, avec mon appraoch, vous n'avez pas besoin d'incrémenter par deux, donc vous faites simplement une boucle for propre, comme ceci :

for(int i = 0; i < BUFFER_LEN; ++i)

1voto

iharob Points 35087

Il suffit d'utiliser un uint16_t à la place, ce qui représente 2 octets par élément,

uint16_t data_buffer[32];

faites attention à l'endianness si cela peut être un problème.

Nota il semble que vous ne sachiez pas que les tableaux sont indexés à 0, alors

for (int i = 1; i < BUFFER_LEN + 1; i += 2)

devrait probablement être ( le plus probable ),

for (int i = 0; i < BUFFER_LEN; i += 2)

Et dans le cas où vous faites ce que je suggère, alors chaque élément est de 2 octets, donc vous aurez besoin de la moitié du nombre d'éléments et bien sûr vous incrémenterez i par 1

for (int i = 0; i < BUFFER_LEN; ++i)

0voto

XAleXOwnZX Points 159

Vous pouvez combiner les deux uint8_t en un seul élément uint16_t par bhtshifting :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X