簡體   English   中英

將十六進制數字轉換為十進制以進行比較(C)

[英]Converting hex digits to decimal for comparison (C)

我正在嘗試創建一個程序,該程序確定是否正確創建了一個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. 字符串將十六進制值復制到該char *
  3. 在該字符上使用strtol

但是,難道沒有更簡單的方法可以做到這一點嗎?

我嘗試了strtol(startaddress,endaddress,16)進行轉換,但程序無法識別。 它期望結束地址為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);

“它期望結束地址為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;
  }
  ...

`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM