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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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

代碼實現(xiàn)

C 語言參考代碼:

#include <stdio.h> #include <stdlib.h> #include <string.h>char *key = "99AD1B5226A37E3E058E3B8E27C2C666"; void main(void) {if(strlen(key) & 1){printf("key 的長度是奇數(shù)!");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"); }

測試結(jié)果:

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

說明:

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

    strtol 介紹

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

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

    兩點注意:

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

    代碼重構(gòu)

    為了方便使用,可以把這個小功能提煉成一個函數(shù),我給它起名為 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("字符串的長度是奇數(shù)!");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()函數(shù):將字符串轉(zhuǎn)換成long(長整型數(shù))_C語言中文網(wǎng)

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。