我需要扫描6字节数据的十六进制表示并将其存储在一个6字节的数组中.
请注意我在嵌入式系统中,所以每个字节数.
以这种方式使用sscanf:
uint8_t buf[6];
char hex[13] = "123456789ABC";
sscanf(hex, "%02X%02X%02X%02X%02X%02X", &buf[0], &buf[1], &buf[2], &buf[3], &buf[4], &buf[5]);
Run Code Online (Sandbox Code Playgroud)
溢出因为每个%02X说明符都在uint32_t中加载.
是否有一个在uint8_t中加载的说明符?(我在任何地方都找不到)
还有另一种方法吗?
我试着这样做:
sscanf(hex, "%08lX%04hX", &buf[0], &buf[4]);
Run Code Online (Sandbox Code Playgroud)
这不会溢出,但由于我在小端结构上,订单混淆了......
抱歉这个"另一个"sscanf问题,但我通过实验找不到任何解决方案.
这是一个我要解析的字符串,并提取由":"分隔的2个子字符串:
char *str = "tag:R123:P1234";
Run Code Online (Sandbox Code Playgroud)
这个功能完成了这项工作:
char r_value[5];
char p_value[6];
sscanf(str, "tag:%[^:]:%s", r_value, p_value);
// now r_value = "R123" and p_value = "P1234"
Run Code Online (Sandbox Code Playgroud)
但现在我想确保我不会溢出我的接收缓冲区:
sscanf(str, "tag:%[^:]:%5s", r_value, p_value);
// this is good for p_value, if I give something bigger than 5 character long it
// will be truncated, if less than 5 character long, I get it also
Run Code Online (Sandbox Code Playgroud)
但问题是%[]格式:
sscanf(str, "tag:%4[^:]:%5s", r_value, p_value);
// this will be ok if initial r_value is 4 char or less long
// but …Run Code Online (Sandbox Code Playgroud)