[英]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出了點問題,我無法弄清楚。
我唯一了解的是執行以下操作:
但是,難道沒有更簡單的方法可以做到這一點嗎?
我嘗試了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.