十六進制字符串 轉換爲 整形

今天,在review 一些代碼的時候,看到了strtol()這個函數,由於以前使用它的時候,還沒有深刻的瞭解,這次,我決定探個究竟。

網上關於這個函數的資料大都來源於同份資料,linux庫函數,講的不夠細緻。於是,我花了幾個小時,認真地嘗試其功能,並整理了這篇文章,希望能對C語言的愛好者一些幫助。

希望大家能夠將本文中發現的錯誤及時反饋給我,以便修正。我的信箱是[email protected]

+----------------+
|      strtol             |
+----------------+

i.e. string to long

long int strtol(const char *nptr, char **endptr, int base)
strtol()會將nptr指向的字符串,根據參數base,按權轉化爲long int, 然後返回這個值。
參數base的範圍爲2~36,和0;它決定了字符串以被轉換爲整數的權值。
可以被轉換的合法字符依據base而定,舉例來說,當base爲2時,合法字符爲‘0’,‘1’;base爲8時,合法字符爲‘0’,‘1’,……‘7’;base爲10時,合
法字符爲‘0’,‘1’,……‘9’;base 爲16時,合法字符爲‘0’,‘1’,……‘9’,‘a’,……‘f’;base爲24時,合法字符爲‘0’,……‘9’,‘a’,……‘n’,base爲36時,合法字符爲‘0’,……‘9’,‘a’,……‘z’;等等。其中,不區分大小寫,比如,‘A’和‘a’會都會被轉化爲10。
當字符合法時,‘0’,……‘9’依次被轉換爲十進制的0~9,‘a’,……‘z’一次北轉換爲十進制的10~35。
strtol()函數檢測到第一個非法字符時,立即停止檢測,其後的所有字符都會被當作非法字符處理。合法字符串會被轉換爲long int, 作爲函數的返
回值。非法字符串,即從第一個非法字符的地址,被賦給*endptr。**endptr是個雙重指針,即指針的指針。strtol()函數就是通過它改變*endptr的值,即把第一個非法字符的地址傳給endptr。

多數情況下,endptr設置爲NULL, 即不返回非法字符串。
下面看幾個例子:
------------------------------------------------------
char buffer[20]="10379cend$3";
char *stop;
printf("%d\n",strtol(buffer, &stop, 2));
printf("%s\n", stop);
輸出結果:
2
379cend$3
-------------------------------------------------------
char buffer[20]="10379cend$3";
char *stop;
printf("%d\n",strtol(buffer, &stop, 8));
printf("%s\n", stop);
輸出結果:
543
9cend$3
--------------------------------------------------------
char buffer[20]="10379cend$3";
char *stop;
printf("%d\n",strtol(buffer, &stop, 10));
printf("%s\n", stop);
輸出結果:
10379
cend$3
-------------------------------------------------------
char buffer[20]="10379cend$3";
char *stop;
printf("%d\n",strtol(buffer, &stop, 16));
printf("%s\n", stop);
輸出結果:
17005006
nd$3
另外,如果base爲0,且字符串不是以0x(或者0X)開頭,則按十進制進行轉化。如果base爲0或者16,並且字符串以0x(或者0X)開頭,那麼,x(
或者X)被忽略,字符串按16進制轉化。如果base不等於0和16,並且字符串以0x(或者0X)開頭,那麼x被視爲非法字符。
例如:
-------------------------------------------------------
char buffer[20]="0x31da6c";
char *stop;
printf("%d\n",strtol(buffer, &stop, 0));
printf("%s\n", stop);
輸出結果(stop爲空):
3267180

-------------------------------------------------------
char buffer[20]="0x31da6c";
char *stop;
printf("%d\n",strtol(buffer, &stop, 13));
printf("%s\n", stop);
輸出結果:
0
0x31da6c
-------------------------------------------------------

最後,需要說明的是,對於nptr指向的字符串,其開頭和結尾處的空格被忽視,字符串中間的空格被視爲非法字符。
例如:
-------------------------------------------------------
char buffer_1[20]="10379c";
char buffer_2[20]="      10379c        ";
char buffer_3[20]="      10      379c        ";
printf("%d\n",strtol(buffer_1,NULL,0));
printf("%d\n",strtol(buffer_2,NULL,0));
printf("%d\n",strtol(buffer_3,NULL,0));
輸出結果爲:
10379
10379
10
--------------------------------------------------------



方法1:

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     char   szValue[]  =   "0x11";   
  5.     int    nValude    =   0;       
  6.     sscanf(szValue,"%x",&nValude);   
  7.     printf("%d\n",nValude);
  8.     return 0;        
  9. }
  10. /*輸出:
  11.   17
  12. */
主要用到sscanf這個庫函數:
函數名: sscanf 
功  能: 執行從字符串中的格式化輸入 
用  法: int sscanf(char *string, char *format[,argument,...]); //%x就是我們要格式化的類型,即輸出十六進制

方法2:
  1. #include <stdio.h>
  2. #include <stdlib.h>//strtol頭文件
  3. int main()
  4. {
  5.     char *p="0x11";   
  6.     char *str;   
  7.     int i = (int)strtol(p, &str, 16);//十六進制
  8.     printf("%d\n",i);
  9.     return 0;        
  10. }
  11. /*輸出:
  12.   17
  13. */

主要用到strtol這個庫函數,它的使用方法是: 

函數名: strtol 
功  能: 將串轉換爲長整數 
用  法: long strtol(char *str, char **endptr, int base);//base指明我們要轉換爲幾進制數
程序例:

  1. #include <stdlib.h> 
  2. #include <stdio.h> 
  3. int main(void) 

  4.    char *string = "0x11", *endptr; 
  5.    long lnumber; 
  6.    /* strtol converts string to long integer */ 
  7.    lnumber = strtol(string, &endptr, 16); 
  8.    printf("string = %s  long = %ld\n", string, lnumber); 
  9.    return 0; 

  10. /*輸出:
  11.   string = 0x11 long = 17
  12. */

在VC 6.0的MFC程序中,我們有時要轉換句柄就可以用strtol這個函數,比如: 

HANDLE handle = (HANDLE)strtol(str,NULL, 16);

PS:句柄是什麼? 

句柄就是用來區分各種內存對象的唯一標識符號,是個32位整數。
有些是整個系統唯一(如窗口句柄),有些是當前進程或線程中唯一(如線程句柄,全局的有另一個標識符)。 

詳細的可分爲許多種,都是以H開頭的。在VB中使用時全部都用Long。
常見的有窗口句柄(HWND),設備描述表句柄(HDC),內存句柄(HMEM),文件句柄,進程句柄,線程句柄,筆的類型句柄(HPEN),字體句柄(HFONT),區域句柄(HRGN)等等。 

在申請句柄時是要佔用資源的,分三類SYSTEM、USER、GDI。而WINDOWS的資源是固定的,並不隨內存的擴大而擴大,所以使用完以後一定要釋放。 

方法3: 

BOOL StrToIntEx(      
    LPCTSTR pszString,
    STIF_FLAGS dwFlags,
    int *piRet
);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章