[英]read 2 bytes in hexadecimal base and convert into decimal using C language fscanf
就像我說的那樣,我使用C語言和fscanf來完成此任務,但似乎每次都會使程序崩潰,那么肯定是我在這里做錯了,即使在閱讀了幾個主題之后,我也沒有處理太多此類輸入我仍然找不到正確的方法,我有這個數組來讀取2個字節
char p[2];
這行讀取它們,當然fopen之前是用文件指針fp調用的,我使用“ rb”作為讀取模式,但是當我發現它崩潰時也嘗試了其他選項,我只是節省空間並專注於麻煩本身。
fscanf(fp,"%x%x",p[0],p[1]);
以后要轉換成十進制,我有這行(如果不是我們達到的EOF)
v = strtol(p, 0, 10);
v僅僅是存儲我們要尋找的最終值的整數。 但是程序在調用scanf時一直崩潰,或者我認為是這樣,我無法編譯為控制台,所以很可惜我無法輸出已完成的內容和沒有的內容,但是在調試器中似乎崩潰了
好吧,我希望您能在此方面為我提供幫助,對於這種類型的讀取/轉換,我有點迷失了,任何線索都會對我有很大幫助,謝謝=)。
PS忘了補充一點,這不是功課,一個朋友想對游戲進行一些文件轉換,並且此代碼將單獨處理所需的文件,因此盡管我可以為此使用任何語言或環境,但我始終對C感到滿意語言
C中的char
字符串實際上稱為以null終止的 字節字符串 。 空終止部分很重要,因為這意味着兩個字符的字符串需要三個字符的空間才能包含空終止符'\\0'
。 沒有終結符意味着字符串函數將在搜索中超出范圍,從而導致不確定的行為 。
此外 , "%x"
格式是讀取十六進制整數並將其存儲在int
。 格式說明符和參數不匹配會導致未定義的行為 。
最后,可能是導致崩潰的原因: scanf
系列函數期望將指針作為其參數。 不提供指針將再次導致未定義的行為 。
以上問題有兩種解決方案:
要使用與您已經使用的代碼相似的代碼,首先必須為數組中的終止符騰出空間。 然后,您需要閱讀兩個字符 。 最后,您需要添加終止符:
char p[3] = { 0 }; // String for two characters, initialized to zero // The initialization means that we don't need to explicitly add the terminator // Read two characters, skipping possible leading white-space fscanf(fp," %c%c",p[0],p[1]); // Now convert the string to an integer value // The string is in base-16 (two hexadecimal characters) v = strtol(p, 0, 16);
將十六進制值直接讀取為整數 :
unsigned int v; fscanf(fp, "%2x", &v); // Read as hexadecimal
第二種選擇是我的建議。 它讀取兩個字符並將其解析為十六進制值,並將結果存儲到變量v
。 重要的是要注意, v
中的值存儲在二進制中! 十六進制,十進制或八進制只是表示格式,在計算機內部,它仍將以二進制1和0存儲(第一種方法也是如此)。 要將其打印為十進制,例如
printf("%d\n", v);
您需要將要掃描到的變量的地址傳遞給fscanf()
。
此外,轉換說明符還需要提供所提供的變量。 在您的情況下,這些是char
。 x
期望int
使用適當的長度修飾符掃描到char
,兩次是h
:
fscanf(fp, "%hhx%hhx", &p[0], &p[1]);
strtol()
期望將C字符串作為第一個參數。
您傳遞的不是C字符串,因為C字符串應該以0
終止,而p
不是。
要解決此問題,您可以執行以下操作:
char p[3]; fscanf(fp, "%x%x", p[0], p[1]); p[2] = '\\0'; long v = strtol(p, 0, 10);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.