我目前正在 STM32F0
上实现智能电表的 SML 读取器。
一切正常,但我在使用 string.h
strstr
时遇到问题
目前情况:
我有一个字符数组数据,其中包含通过 USART 传入的所有数据。它包含十六进制数字和有效的文本字符串。
该字符串中的某处有以下序列:
{0x01,0x01,0x62,0x1b,0x52,0x00,0x55}
。
我想使用 strstr
查找该子字符串在数据字符串中的位置。
它与此示例字符串配合得很好,该字符串始终位于数据字符串的最开头:{0x1b,0x1b,0x1b,0x1b,0x01,0x01,0x01,0x01,0x76,0x05}
但是如果我使用其他子字符串,它就不起作用。
这是我的代码:
const char needle[] = {0x01,0x01,0x62,0x1b,0x52,0x00,0x55};
if((needle_ptr = strstr(Data,needle)) == NULL){
//No Active Power String detected
flags &= ~NewPowervalue; //Reset NewPowervalue flag
}else{
Powervalue = (needle_ptr[14]<<24) + (needle_ptr[15]<<16) + (needle_ptr[16]<<8) + (needle_ptr[17])/10000;
//Extract and calculate Powervalue
flags |= NewPowervalue; //Set NewPowervalue flag
Poweroutlets(&Powervalue);
GPIOC->ODR ^= BLED;
}
有人知道我做错了什么吗?
最佳答案
当然不行,因为0x00是asciiz终止符,而strstr()
比较的是asciiz终止的字符串,所以在0x00处停止比较。
您展示的另一个示例字符串有效,因为它不包含任何 0x00。
因此,归根结底,您不想比较字符串(因为字符串是在 C 中定义的),而是比较内存区域。
因此,您要么必须使用 memmem()
函数(如果您的运行时库有),要么编写自己的函数,这应该不难。 (甚至找到 memmem()
的某些实现的源代码也不难。)
关于c - 使用 strstr 时出现奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45551595/