【问题标题】:true condition check on a string of characters对字符串的真实条件检查
【发布时间】:2019-12-10 07:56:04
【问题描述】:

早安

我目前正在检查传入字符缓冲区中的真实条件,如下所示。下面我在 BLE 字符串中寻找 197403290000000000123456789ABC0000。

uint8_t buf[BLE_MAX_ADV_DATA_LEN];

 if ((buf[13]==0x19)&&(buf[14]==0x74)&&(buf[15]==0x03)&&(buf[16]==0x29)&&(buf[17]==0x00)&&(buf[18]==0x00)&&
(buf[19]==0x00)&&(buf[20]==0x00)&&(buf[21]==0x00)&&(buf[22]==0x00)&&(buf[23]==0x12)&&(buf[24]==0x34)&&
(buf[25]==0x56)&&(buf[26]==0x78)&&(buf[27]==0x9A)&&(buf[28]==0xBC)&&(buf[29]==0x00)&&(buf[30]==0x00)){   

  then do stuff
} 

它确实有效,但是否有更好的方法来比较字符串段并将其与已知段进行比较。

【问题讨论】:

  • 我会将比较封装到一个函数中,这样您的 if 语句就不会那么臃肿,但我不知道更好的方法来摆脱所有比较。您也可以将十六进制值转换为相应的 ascii 字符,然后使用字符串比较函数,但随后信息会丢失
  • 请不要使用magic numbers
  • 您可以通过创建仅包含要比较的数据的第二个缓冲区来解决您的问题,然后使用std::memcmp

标签: c++ arrays string char compare


【解决方案1】:

您可以使用 memcmp 并将缓冲区与硬编码数组进行比较。 我还添加了一个方便的函数,它可以返回静态数组中的项目数(如果你在 Windows 上构建,你可以使用 _countof )。从 C++ 17 开始,您可以使用 std::size

#include <cstring>  // has the declaration of memcmp

template<typename T, size_t SizeOfArray>
constexpr size_t countof(T (&array)[SizeOfArray]) { return SizeOfArray; }

实际代码:


    uint8_t expectedValues[] = {0x19, 0x74, 0x03, 0x29, ...};
    uint8_t buf[BLE_MAX_ADV_DATA_LEN];

    if (0 == memcmp(buf, expectedValues, countof(expectedValues)))
    {
            // the buffer contains the expected values
    }

【讨论】:

  • 这不是一个有效的答案,因为这只是 MS,问题不是。在标准 C++ 中,我们有 std::count 和 std::count_if。
  • 怎么不规范?我已经提供了 countof 的声明。
  • 对不起,我的意思是 std::size。为什么不使用它? countof 这个名字有误导性(它误导了我),因为我们在 C++ 库中有 std::count ,它做了其他事情。
  • @nada 我不知道,每天你都会学到新东西。谢谢! :)。我已经更新了答案。
  • 在 C++17 之前的跨平台替代方案中有 this question。 OT:是的,C++ 随着每个新标准(当然是 imo)变得越来越漂亮,我希望它保持这种状态。 C++17 甚至有 std::filesystem ;) 哇
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 2021-03-27
  • 2017-07-03
  • 2017-01-11
  • 2019-01-21
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多