日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言16进制字符串转数字

發布時間:2023/12/31 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言16进制字符串转数字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

假設有一個十六進制字符串,“99AD1B5226A37E3E058E3B8E27C2C666”,如何把它按照字節來切分,然后轉成整型?也就是說轉換成 0x99, 0xAD, 0x1B, …

代碼實現

C 語言參考代碼:

#include <stdio.h> #include <stdlib.h> #include <string.h>char *key = "99AD1B5226A37E3E058E3B8E27C2C666"; void main(void) {if(strlen(key) & 1){printf("key 的長度是奇數!");return;}char byte[3] = {0};char *p = key;char *endptr;unsigned int res;for(int i = 0; i < strlen(key); i += 2){memcpy(byte, &key[i], 2);res = strtol(byte, &endptr, 16);printf("%02x ", res);}printf("\n"); }

測試結果:

99 ad 1b 52 26 a3 7e 3e 05 8e 3b 8e 27 c2 c6 66

說明:

  • 代碼中要求待轉換字符串的長度是偶數,如果是奇數,可以手動補零
  • 用到的關鍵函數是 strtol,它的原型是
  • long int strtol (const char* str, char** endptr, int base);

    strtol 介紹

    long int strtol (const char* str, char** endptr, int base);

    【參數說明】
    str 為要轉換的字符串,endstr 為第一個不能轉換的字符的指針,base 為字符串 str 所采用的進制。
    【函數說明】
    strtol() 會掃描參數 str 字符串,跳過前面的空白字符(例如空格,tab縮進等,可以通過 isspace() 函數來檢測),直到遇上數字或正負符號才開始做轉換,再遇到非數字或字符串結束時(’\0’)結束轉換,并將結果返回。

    兩點注意:

  • 當 base 的值為 0 時,默認采用 10 進制轉換,但如果遇到 ‘0x’ / ‘0X’ 前置字符則會使用 16 進制轉換,遇到 ‘0’ 前置字符則會使用 8 進制轉換。
  • 若endptr 不為NULL,則會將遇到的不符合條件而終止的字符指針由 endptr 傳回;若 endptr 為 NULL,則表示該參數無效,或不使用該參數。
  • 【返回值】
    返回轉換后的長整型數;如果不能轉換或者 str 為空字符串,那么返回 0(0L);如果轉換得到的值超出 long int 所能表示的范圍,函數將返回 LONG_MAX 或 LONG_MIN(在 limits.h 頭文件中定義),并將 errno 的值設置為 ERANGE。

    代碼重構

    為了方便使用,可以把這個小功能提煉成一個函數,我給它起名為 hex_string_to_u8。

    #include <stdio.h> #include <stdlib.h> #include <string.h>typedef unsigned char u8;int hex_string_to_u8(const char *hex_str, char *out) {if(strlen(hex_str) & 1){printf("字符串的長度是奇數!");return -1;}char byte[3] = {0};const char *p = hex_str;int j = 0;for(int i=0; i<strlen(hex_str); i+=2){memcpy(byte, &p[i], 2);out[j++] = strtol(byte, NULL, 16);} return 0; }void hexdump(void *data, int size){if (size <= 0) return;int i;for (i=0; i<size;i++){printf("%02X ", ((u8 *)data)[i]);}printf("\n"); }void main(void) {char *key = "99AD1B5226A37E3E058E3B8E27C2C666";char res[16] = {0};hex_string_to_u8(key, res);hexdump(res, 16); }

    參考資料:
    C語言strtol()函數:將字符串轉換成long(長整型數)_C語言中文網

    總結

    以上是生活随笔為你收集整理的C语言16进制字符串转数字的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。