Comparer les données uint8_t avec une chaîne

Cela peut sembler un peu étrange ou la question peut être sortingviale, mais j’ai passé la majeure partie de ma vie à programmer en PHP (ouais, je sais à quoi ça ressemble). Ainsi, lorsque je suis passé au C ++, il y a des choses que je ne connais pas bien (cause des habitudes php).

Donc, je charge les données d’en-tête wav en utilisant struct. Les valeurs sont définies en tant que type uint8_t:

typedef struct WAV_HEADER { uint8_t RIFF[4]; // RIFF uint8_t WAVE[4]; // WAVE } 

Je dois les comparer avec des chaînes de quatre lettres pour quelque chose comme ça:

 if(wavHeader.RIFF[0] . wavHeader.RIFF[1] . wavHeader.RIFF[2] . wavHeader.RIFF[3] == 'RIFF') { do sth } 

Cela devrait être facile de vérifier si le fichier chargé est un fichier Wave (* .wav). Merci pour toute aide.

Les chaînes en C et C ++ ont une terminaison nulle . RIFF et WAVE ne sont pas techniquement des chaînes de style C, car il n’existe pas de terminateur null, vous ne pouvez donc pas utiliser une simple chaîne de style C / C ++, comme strcmp . Vous pouvez toutefois les comparer de différentes manières avec les chaînes que vous souhaitez:

  • if (header.RIFF[0] == 'R' && header.RIFF[1] == 'I' && header.RIFF[2] == 'F' && header.RIFF[3] == 'F') { // .. }
  • if (strncmp((const char*)header.RIFF, "RIFF", 4) == 0) { // .. }
  • if (memcmp(header.RIFF, "RIFF", 4) == 0) { // .. }

strncmp memcmp strncmp ou memcmp . Ils finissent par faire la même chose, mais sémantiquement, strncmp est une fonction de comparaison de chaînes qui rend peut-être le code plus clair.

Pour strncmp voir ici . Pour memcmp voir ici .