我正在尝试制作一个程序来确定是否正确创建了一个intel hex文件,而我用来生成它们的一个程序没有正确生成一个,所以我要制作一个。
到目前为止,我可以从目标文件中读取一行,但是我在将十六进制数字从字符串转换为要比较的数字时遇到问题。这是我令人不安的片段:
//hx=opened file handle
unsigned char hexv,hexsz,hexcs;
while ((line=getline(&hexstring,&buffer,hx))> -1){
//Trying to convert hexadecimal character in byte 7 and 8 of string to number
//Hexsz must contain actual number representing number of hex digits to process
sprintf(hexsz,"%02x",hexstring[7]);
//Checksum = 0
hexcs=0;
for (hexc=0;hexc<(hexsz*2);hexc+=2){
//Add next hexadecimal number to checksum
sprintf(hexv,"%02x",hexstring[9+hexc]);
hexcs+=hexv;
}
//Check checksum with stored checksum
sprintf(hexv,"%02x",hexstring[9+hexc]);
if (hexcs != hexv){
printf("HEX checksum error!\n");
}
}
这些sprintf出了点问题,我无法理解。
我唯一知道的是做以下事情:
但是,有没有更简单的方法呢?
我尝试strtol(startaddress,endaddress,16)进行转换,程序无法识别。它期望endaddress为NULL。
那么将大字符串中的双字节字符串转换为十六进制的更简单方法是什么?
例如,如果我的字符串是
:10007B00AB83AD8290015C938D828B83F531EF85E1
我想从它转换值7B,这是最简单的方法吗?
将大字符串中的双字节字符串转换为十六进制的简单方法?
隔离两个字符并转换。
// 012345678
const char *s = ":10007B00AB83AD8290015C938D828B83F531EF85E1";
int n = 5;
unsigned value;
if (sscanf(s + n, "%2x", &value) == 1) {
printf("Value at %.2s: %02X\n", s+n, value);
} else {
puts("Fail");
}
要么
// Form a 3-char string such as '7', 'B', '\0'
const char substring[3] = { s[n], s[n+1] };
char *endptr;
long value = strtol(substring, &endptr, 16);
if (endptr > substring) {
printf("Value at %s: %02X\n", substring, value);
} else {
puts("Fail");
}
strtol(startaddress,endaddress,16)
错误地使用了strtol()
。 endptr
是指针的地址,而不仅仅是结束地址。
long int strtol(const char * restrict nptr, char ** restrict endptr, int base);
“它希望endaddress为NULL。” - >在这里传递NULL
没关系,但是代码缺少信息来决定转换是否成功。相反,传递char *
的地址,如上所述。然后测试以查看转换是否发生。
迂腐代码不会在s[n+1]
中使用{ s[n], s[n+1] };
而不知道s[n]
不是空字符。但我希望循环已经检查过了。
const char *s = ":10007B00AB83AD8290015C938D828B83F531EF85E1";
if (s[0] == ':') {
unsigned n = 1;
while (s[n] && s[n+1]) {
const char substring[3] = { s[n], s[n+1] };
...
n += 2;
}
...
`