C语言16进制字符串转数字
假設(shè)有一個十六進制字符串,“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說明:
strtol 介紹
long int strtol (const char* str, char** endptr, int base);【參數(shù)說明】
str 為要轉(zhuǎn)換的字符串,endstr 為第一個不能轉(zhuǎn)換的字符的指針,base 為字符串 str 所采用的進制。
【函數(shù)說明】
strtol() 會掃描參數(shù) str 字符串,跳過前面的空白字符(例如空格,tab縮進等,可以通過 isspace() 函數(shù)來檢測),直到遇上數(shù)字或正負符號才開始做轉(zhuǎn)換,再遇到非數(shù)字或字符串結(jié)束時(’\0’)結(jié)束轉(zhuǎn)換,并將結(jié)果返回。
兩點注意:
【返回值】
返回轉(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言ascii码表6,C语言附录ASC
- 下一篇: vsftpd安装与配置