【问题标题】:Comparing uint8_t data with string将 uint8_t 数据与字符串进行比较
【发布时间】:2016-01-09 21:08:44
【问题描述】:

这听起来可能有点奇怪,或者问题可能是一个微不足道的问题,但在我生命的大部分时间里,我都在用 PHP 编程(是的,我知道这听起来如何)。所以当我切换到 C++ 时,有些东西对我来说非常陌生(由于 php 习惯)。

所以我正在使用 struct 加载 wav 标头数据。值定义为 uint8_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 }

这应该很容易检查加载的文件是否为 Wave 文件 (*.wav)。感谢您的帮助。

【问题讨论】:

  • 你可能想要的是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

标签: c++ wav


【解决方案1】:

C 和 C++ 中的字符串是 null-terminatedRIFFWAVE 在技术上不是 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) { // .. }

我个人会使用strncmpmemcmp。他们最终做同样的事情,但语义上strncmp 是一个字符串比较函数,它可能使代码更清晰。

对于strncmp,请参阅here。 对于memcmp,请参阅here

【讨论】:

  • 您遇到什么错误,您使用的是什么编译器?您必须包含 string.h 才能使用 strncmp
  • 糟糕,谢谢,我更新了我的答案。您必须将RIFF 成员转换为const char* 才能使用strncmp
  • 我只是说它们在技术上不是字符串,因为它们没有任何空终止符,但在语义上你可能会认为它们是字符串。我添加了一些文字来提及这一点。希望它更清楚一点。
  • 是的,我想说这让你的逻辑更清晰,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 2019-01-22
相关资源
最近更新 更多