将 uint8_t 数据与字符串进行比较
Comparing uint8_t data with string
这听起来可能有点奇怪,或者问题可能是一个微不足道的问题,但在我生命的大部分时间里,我都在 PHP 中编程(是的,我知道这听起来如何)。所以当我切换到 C++ 时,有些事情对我来说很陌生(因为 php 习惯)。
所以我正在使用结构加载 wav header 数据。值定义为 uint8_t 类型:
typedef struct WAV_HEADER
{
uint8_t RIFF[4]; // RIFF
uint8_t WAVE[4]; // WAVE
}
我必须将它们与 four-letter 字符串进行比较以获得类似的东西:
if(wavHeader.RIFF[0] . wavHeader.RIFF[1] . wavHeader.RIFF[2] . wavHeader.RIFF[3] == 'RIFF')
{ do sth }
这应该很容易检查加载的文件是否是 Wave 文件 (*.wav)。感谢您的帮助。
C 和 C++ 中的字符串是 null-terminated。 RIFF
和 WAVE
在技术上不是 C-style 字符串,因为没有空终止符,所以你不能只使用直接的 C/C++ 风格的字符串比较,比如 strcmp
。然而,您可以通过多种方式将它们与您想要的字符串进行比较:
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
是一个字符串比较函数,可能使代码更清晰。
这听起来可能有点奇怪,或者问题可能是一个微不足道的问题,但在我生命的大部分时间里,我都在 PHP 中编程(是的,我知道这听起来如何)。所以当我切换到 C++ 时,有些事情对我来说很陌生(因为 php 习惯)。
所以我正在使用结构加载 wav header 数据。值定义为 uint8_t 类型:
typedef struct WAV_HEADER
{
uint8_t RIFF[4]; // RIFF
uint8_t WAVE[4]; // WAVE
}
我必须将它们与 four-letter 字符串进行比较以获得类似的东西:
if(wavHeader.RIFF[0] . wavHeader.RIFF[1] . wavHeader.RIFF[2] . wavHeader.RIFF[3] == 'RIFF')
{ do sth }
这应该很容易检查加载的文件是否是 Wave 文件 (*.wav)。感谢您的帮助。
C 和 C++ 中的字符串是 null-terminated。 RIFF
和 WAVE
在技术上不是 C-style 字符串,因为没有空终止符,所以你不能只使用直接的 C/C++ 风格的字符串比较,比如 strcmp
。然而,您可以通过多种方式将它们与您想要的字符串进行比较:
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
是一个字符串比较函数,可能使代码更清晰。