C语言16进制字符串转数字
生活随笔
收集整理的這篇文章主要介紹了
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);【參數說明】
str 為要轉換的字符串,endstr 為第一個不能轉換的字符的指針,base 為字符串 str 所采用的進制。
【函數說明】
strtol() 會掃描參數 str 字符串,跳過前面的空白字符(例如空格,tab縮進等,可以通過 isspace() 函數來檢測),直到遇上數字或正負符號才開始做轉換,再遇到非數字或字符串結束時(’\0’)結束轉換,并將結果返回。
兩點注意:
【返回值】
返回轉換后的長整型數;如果不能轉換或者 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进制字符串转数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言ascii码表6,C语言附录ASC
- 下一篇: vsftpd安装与配置