Преобразование шестнадцатеричных цифр в десятичные для сравнения (C) - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь создать программу, которая определяет, правильно ли создан шестнадцатеричный файл Intel, и одна программа, которую я использую для их создания, не сгенерировала его правильно, поэтому я собираюсь создать ее.

Пока что я могу прочитать строку из целевого файла, но у меня возникла проблема с преобразованием шестнадцатеричного числа из строки в число для сравнения.Вот мой тревожный фрагмент:

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

Что-то не так с этими спринтами, и я не могу понять это.

Единственное, что я знаю, это сделать следующее:

  1. Выделить временный символ *
  2. строка скопировать шестнадцатеричное значение в этот символ *
  3. использовать strtol для этого символа

Но не 'Есть ли более простой способ сделать это?

Я попытался преобразовать strtol (startaddress, endaddress, 16), и программа не распознала бы это.Ожидается, что endaddress будет равен NULL.

Так, как проще всего преобразовать двухбайтовую строку в большой строке в шестнадцатеричное?

Например, если моя строка

:10007B00AB83AD8290015C938D828B83F531EF85E1

и я хотел преобразовать из него значение 7B, какой самый простой способ сделать это?

1 Ответ

0 голосов
/ 02 марта 2019

простой способ преобразования двухбайтовой строки в большой строке в шестнадцатеричное?

Выделение двух символов и преобразование.

//               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] в { 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;
  }
  ...

`

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...