我有一个包含以下格式的HEX值的文件
0x020x000x000x000x000x000x680x000x000x000x020x000x000x000x000x00
我想读取这些十六进制值并将其保存为相同格式的Unsigned char数组中的十六进制值
代码片段(十六进制是char数组,licensebin是unsigned char数组)
fgets(hex, sizeof(hex), licenseFile);
used = 0;
while ((sscanf(hex+used, "%x", &licensebin[i]))==1)
{
printf("%x", licensebin[i]);
offset = 4;
used += offset;
i++;
}
上面的代码没有正确读取值 .
4 回答
scanf function (and family)在读取数据时是贪婪的,这意味着
"%x"
格式将从下一个数字读取前导零作为当前数字的最后一个零 .在您显示的示例中,它读取的第一个数字将是
0x020
而不是0x02
.这可以通过告诉
sscanf
只读取四个字符来轻松解决:添加有关
licensebin[i]
为unsigned char
的注释后,实际应该是正确的格式前缀
"hh"
告诉sscanf
该参数实际上是指向unsigned char
的指针 . 你仍然需要告诉sscanf
只能读取最多四个字符,因为它仍然是贪婪的 .我尝试了下面的工作 . 当使用%x而不是unsigned char时,您可能需要将许可证定义为int:
也许改变这个:
对此:
(感谢大家提醒我scanf在匹配%x时所期望的类型 . )
这旨在匹配输入中的文字“0x”,并将读取的十六进制数字的数量限制为2 .
或者改变:
至:
所有这些假设许可证是这样的:
那就是你真的有一个'0'字符,'x'字符等 . 如果你的数据是二进制的,你需要一个完全不同的方法 .
处理十六进制字符串转换的最简单方法之一是使用
strtoul
及其读取/转换base-16
的能力 .strtoul
可以与指针一起使用,逐步执行输入字符串,提供每个找到的值的转换,然后只需将指针移动到下一个值的开头即可 . 根据您的输入,strchr
用于定位每个'x'
然后转换后面的2个字符 .为了帮助完成此过程,您可以编写一个简单的函数来提供转换的所有错误检查和验证 . 像下面这样的东西效果很好:
您只需要最少的代码就可以将函数应用于数据文件中的所有行 . 例如:
Input Files
Use/Output
仔细看看,如果您有任何疑问,请告诉我 .