将十六进制数字转换为十进制以进行比较(C)

时间:2019-03-02 20:31:40

标签: c string numbers hex decimal

我正在尝试创建一个程序,该程序确定是否正确创建了一个int十六进制文件,而我用来生成它们的一个程序没有正确生成一个文件,所以我要制作一个。

到目前为止,我可以从目标文件中读取一行,但是将十六进制数从字符串转换为要比较的数字时遇到问题。这是我令人烦恼的代码段:

//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出现了问题,我无法弄清。

我唯一知道的是执行以下操作:

  1. 分配临时字符*
  2. 将十六进制值字符串复制到该字符*
  3. 在该字符上使用strtol

但是有没有更简单的方法呢?

我尝试使用strtol(startaddress,endaddress,16)进行转换,但程序无法识别。期望结束地址为NULL。

那么将大字符串中的两个字节的字符串转换为十六进制的更简单方法是什么?

例如,如果我的字符串是

:10007B00AB83AD8290015C938D828B83F531EF85E1

我想从中转换值7B,最简单的方法是什么?

1 个答案:

答案 0 :(得分:2)

  

将大字符串中的两字节字符串转换为十六进制的简单方法?

隔离两个字符并进行转换。

//               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);

“它期望结束地址为NULL。” ->在此处传递NULL是可以的,但是代码缺乏信息来确定转换成功。相反,如上所述,传递char *的地址。然后测试一下是否发生了转换。


在不知道s[n+1]不是空字符的情况下,pedantic代码不会在{ 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;
  }
  ...

`