C++ 将uint8_t数据与字符串进行比较

C++ 将uint8_t数据与字符串进行比较,c++,wav,C++,Wav,这听起来可能有点奇怪,或者这个问题可能很琐碎,但我大部分时间都在用PHP编程(是的,我知道这听起来是怎么回事)。所以当我切换到C++时,我的一些事情就不太常见了(PHP习惯的原因)。 所以我使用struct加载wav头数据。值定义为uint8\u t类型: typedef struct WAV_HEADER { uint8_t RIFF[4]; // RIFF uint8_t WAVE[4]; // WAVE } 我必须

这听起来可能有点奇怪,或者这个问题可能很琐碎,但我大部分时间都在用PHP编程(是的,我知道这听起来是怎么回事)。所以当我切换到C++时,我的一些事情就不太常见了(PHP习惯的原因)。 所以我使用struct加载wav头数据。值定义为uint8\u t类型:

typedef struct  WAV_HEADER
{
   uint8_t         RIFF[4];        // RIFF
   uint8_t         WAVE[4];        // WAVE
}
我必须将它们与四个字母的字符串进行比较:

if(wavHeader.RIFF[0] . wavHeader.RIFF[1] . wavHeader.RIFF[2] . wavHeader.RIFF[3] == 'RIFF')
{ do sth }
如果加载的文件是波形文件(*.wav),则应易于检查。谢谢任何帮助。

C和C++中的字符串是.

RIFF
WAVE
在技术上不是C风格的字符串,因为没有空终止符,所以不能像
strcmp
那样直接使用C/C++风格的字符串比较。但是,有几种方法可以将它们与所需字符串进行比较:

  • 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是一个字符串比较函数,它可能会使代码更清晰

有关
strncmp
的信息,请参阅。
对于
memcmp
请参见。

您可能想要的是
if(memcmp(wavHeader.RIFF,“RIFF”,4)==0)
是的,这很有效。非常感谢。顺便问一下,有没有其他不包括memory.h的解决方案?当然你也可以做
if(wavHeader.RIFF[0]='R'&&wavHeader.RIFF[1]='I'&&wavHeader.RIFF[2]='F'&&wavHeader.RIFF[3]='F')
非便携解决方案,需要
RIFF
正确对齐:
*(int*)RIFF=='RIFF'
*(int*)RIFF=='FFIR'取决于尾数。为了使其更便于移植:
*(int*)RIFF==0x46464952
您会遇到什么错误,您使用的是什么编译器?您必须包含
string.h
才能使用
strncmp
。噢,谢谢,我更新了我的答案。您必须将
RIFF
成员转换为
const char*
才能使用
strncmp
。我的意思是,从技术上讲,它们不是字符串ce它们没有任何空终止符,但从语义上讲,你可能会认为它们是字符串。我添加了一些文字来提到这一点。希望它更清晰一些。是的,我想说这让你的逻辑更清晰了,谢谢。