如何将 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】:char
、signed char
、unsigned char
、int8_t
和 uint8_t
类型之间的大多数转换可以被认为是安全的。这些是字符类型,并带有各种特殊例外,使它们比其他类型更“坚固”。
具体来说,字符类型:
不能错位。 不能包含填充位或陷阱表示。 有效类型/严格别名规则有例外。 总是大小为 1 个字节。这意味着您可以在不同字符类型之间进行各种狂野的转换。除了少数例外:
当从无符号类型转换为有符号类型时,数据可能不一定适合,您将覆盖符号位。这可能会导致错误。 “抛弃”const
或 volatile
限定符(如果存在)是危险的。
因此,将uint8_t*
转换为char*
并将数据取消引用为另一种类型(char*)uartRX_data
是安全的。特别是如果您知道 uint8_t
数组包含有效的 7 位字符,但 MSB 从未设置,并且数组末尾有一个空终止符。
【讨论】:
以上是关于如何将 uint8_t 数组与 C 中的字符串进行比较?的主要内容,如果未能解决你的问题,请参考以下文章
将 uint8_t 数组转换为 C 中的 uint16_t 值
将指向 uint16_t 的指针传递给需要 C 中 uint8_t[] 数组的子例程 - 如何?