c - 使用 sscanf 从字符串中读取十六进制值
问题描述
我想从一个字符串中读取一个十六进制值并将其存储为一个变量,我正在使用sscanf
但原始数字是 6 个字节,我只得到最不重要的 4 个字节。
这是我正在使用的代码:
#include <stdio.h>
int main(void) {
const char my_string[] ="\r\n0080254800DA 0x02 C\n0080254800DA 0x02 P\n9C04EB06ACA2 0x03 P";
unsigned int a,b,c,d,e,f;
char s1,s2,s3;
sscanf(my_string, "\r\n%16x %X %c\n%16x %x %c\n%16x %x %c\n", &a, &b, &s1,&c,&d,&s2,&e,&f,&s3);
printf("\r\n%#-X %#2x %c\n%#-X %#2x %c\n%#-X %#2x %c\n", a,b, s1,c,d,s2,e,f,s3);
return 0;
}
这是我得到的结果:
0X254800DA 0x2 C
0X254800DA 0x02 P
0XEB06ACA2 0x3
我该如何纠正这个?
解决方案
我猜你使用的是 32 位大小的整数。要存储 12 个字符的十六进制整数,您需要大于 32 位的类型:
#include <stdio.h>
/* this include defines [u]int[8|16|32|64]_t types */
#include <stdint.h>
int main(void) {
const char my_string[] ="\r\n0080254800DA 0x02 C\n0080254800DA 0x02 P\n9C04EB06ACA2 0x03 P";
/* use Unsigned INTeger on 64 bits */
uint64_t a, b, c, d, e, f;
char s1,s2,s3;
/* sscanf/printf formatting need some +l to handle such types */
sscanf(my_string, "\r\n%16lx %lX %c\n%16lx %lx %c\n%16lx %lx %c\n", &a, &b, &s1,&c,&d,&s2,&e,&f,&s3);
printf("\r\n%#-lX %#2lx %c\n%#-lX %#2lx %c\n%#-lX %#2lx %c\n", a,b, s1,c,d,s2,e,f,s3);
return 0;
}
推荐阅读
- c# - Unity 2D How to Make a Multi Input Attack
- c# - ContentView 获取选择器选择的值
- c - char** argv 作为字符串数组传递
- c - 如何将标准输入和标准输出附加到 call_usermodehelper 调用的用户进程
- html - 4 个响应式 div 在选项卡和移动设备上未正确显示
- python - Tensorflow/Spyder 重置没有错误
- ruby-on-rails - Elasticsearch-model - 尝试引用父数据以添加到索引
- url - 如何从网站获取准确的 URL?
- r - 为组中的每个行组合创建一个新数据集
- javascript - 如何加载和卸载(删除)css 和 javascript 导入/文件?