c - C sscanf("%hhx") 读取一个 unsigned int 而不是 unsigned char
问题描述
我们使用 sscanf() 将十六进制值转换为字符串,如下所示:
#include <stdio.h>
#include <string>
int main() {
char data[] = "41424344";
unsigned int result = 0;
sscanf(data, "%hhx", &result);
printf("%x\n", result);
result = 0;
sscanf(data, "%2x", &result);
printf("%x\n", result);
result = 0;
sscanf(data, "%2hhx", &result);
printf("%x\n", result);
return 0;
}
输出:
41424344
41
41
从第一个输出中,我们可以看到sscanf("%hhx")
读取整个 4 个字节而不是 1 个字节(“unsigned char”)。为什么?
解决方案
由于格式说明符和参数类型不匹配而导致的未定义行为。
根据例如这个scanf
参考,hh
前缀意味着参数需要是一个,这与你传递unsigned char *
的完全不同。unsigned int *
%2hhx
实际上,您的格式也有这个问题。
推荐阅读
- java - 反应式编程和消息队列的区别
- c# - 在 RowValidated 事件中向 DataGridView 添加行时出错
- python - 如何使用 selenium webdriver 检索类中反应元素的属性?
- javascript - 我可以创建单独的 ts 文件来为 Angular 4 应用程序中的所有组件编写业务逻辑吗?
- canoe - CANoeILNLVector.dll 文件对应的 API
- python - 脱落列表层 - Python
- reactjs - 防止 React 应用程序被抓取的最佳方法是什么?
- ios - 反复要求信任开发商
- php - 无法使用 ghostscript 解锁 PDF 文件
- cordova - 将 cordova 应用程序与 IP/网络打印机连接