如何将 uint8_t 数组与 C 中的字符串进行比较?

How to compare uint8_t array to a string in C?

我有一个来自 UART 的输入。

uint8_t uartRX_data[UART_RX_BUF_SIZE]="";

我需要将此数据传递给一个函数。而且,在这个函数中,我想将它与预定义的字符串进行比较,例如:

char RESP_OK[]                  = "OK";
char RESP_ERROR[]               = "ERROR";
char RESP_FAIL[]                = "FAIL";

最简单的方法是什么?

编辑:我的问题只是关于数据比较和传递给函数的数据。

只要 uartRX_data 中的字符串以 NULL 结尾,您就可以像这样使用 strcmp

if (strcmp((const char *)uartRX_data, RESP_OK) == 0)
{
  // handle OK
}
else if (strcmp((const char *)uartRX_data, RESP_ERROR) == 0)
{
  // handle ERROR
}
else if (strcmp((const char *)uartRX_data, RESP_FAIL) == 0)
{
  // handle FAIL
}
else
{
  // handle unknown response
}

大多数charsigned charunsigned charint8_tuint8_t类型之间的转换都可以认为是安全的。这些是字符类型,并带有各种特殊例外,使它们比其他类型"rugged"更多。

具体的字符类型:

  • 不能错位。
  • 不能包含填充位或陷阱表示。
  • 有效 type/strict 别名规则有例外。
  • 总是 1 字节大小。

这意味着您可以在不同字符类型之间进行各种疯狂的转换。除了少数例外:

  • 当从无符号类型变为有符号类型时,数据可能不一定适合,您将覆盖符号位。这可能会导致错误。
  • "cast away" constvolatile 限定符(如果存在)是危险的。

因此,从 uint8_t* 转换为 char* 并将数据取消引用为另一种类型 (char*)uartRX_data 是安全的。特别是如果您知道 uint8_t 数组仅包含有效的 7 位字符,但从未设置 MSB,并且在数组末尾有空终止符。