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

Posted

技术标签:

【中文标题】如何将 uint8_t 数组与 C 中的字符串进行比较?【英文标题】:How to compare uint8_t array to a string in C? 【发布时间】:2019-05-03 09:56:13 【问题描述】:

我有一个来自 UART 的输入。

uint8_t uartRX_data[UART_RX_BUF_SIZE]="";

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

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

最简单的方法是什么?

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

【问题讨论】:

uartRX_data 中的数据是否以 NUL ('\0') 字符结尾,或者是否有单独的变量告诉缓冲区中的有效字节数?如果缓冲区没有以 NUL ('\0') 字符终止,它是否有空间添加一个?请edit您的问题添加信息。 'uartRX_data' 不是缓冲区的原始数据。我在事件处理程序下解析原始数据以创建 'uartRX_data' 。数据不以 NUL 终止。它只包含字符。 那么一个非分隔的字符数组?这个数组是否会包含比您上面列出的 3 个额外的子字符串? 请edit您的问题添加此信息。你怎么知道uartRX_data 中有多少个有效字符?是否有包含字符数的变量?缓冲区是否有空间添加 NUL? 那么 strcmp((const char *)uartRX_data, RESP_OK) 等等应该可以工作。 【参考方案1】:

只要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

【讨论】:

【参考方案2】:

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

具体来说,字符类型:

不能错位。 不能包含填充位或陷阱表示。 有效类型/严格别名规则有例外。 总是大小为 1 个字节。

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

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

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

【讨论】:

以上是关于如何将 uint8_t 数组与 C 中的字符串进行比较?的主要内容,如果未能解决你的问题,请参考以下文章

将 uint8_t 数组转换为 C 中的 uint16_t 值

如何将字符数组转换为 uint8_t

将指向 uint16_t 的指针传递给需要 C 中 uint8_t[] 数组的子例程 - 如何?

c char 数组到 uint8_t 数组

使用 emscripten 如何将 C++ uint8_t 数组获取到 JS Blob 或 UInt8Array

Emscripten将uint8_t数组传递给javascript?