小编GPT*_*nno的帖子

sscanf 1字节十六进制数据,没有溢出

我需要扫描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中加载.

  • %02lX将加载到uint32_t中
  • %02hX将加载到uint16_t中

是否有一个在uint8_t中加载的说明符?(我在任何地方都找不到)

还有另一种方法吗?

我试着这样做:

sscanf(hex, "%08lX%04hX", &buf[0], &buf[4]);
Run Code Online (Sandbox Code Playgroud)

这不会溢出,但由于我在小端结构上,订单混淆了......

c embedded scanf overflow

6
推荐指数
2
解决办法
5660
查看次数

sscanf说明符%[]和缓冲区溢出

抱歉这个"另一个"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)

c embedded scanf

1
推荐指数
1
解决办法
549
查看次数

标签 统计

c ×2

embedded ×2

scanf ×2

overflow ×1