2012-05-16 151 views
0

可能重複:
Hex to char array in C如何將c中保存十六進制數字的字符串轉換爲十六進制格式?

例如,如果我想這樣"F32FC0F5EC894E16"一個十六進制數我將其存儲在unsigned char變量是這樣的:

unsigned char s[8] = {0xF3, 0x2F, 0xC0, 0xF5, 0xEC, 0x89, 0x4E, 0x16}; 

但如果我得到這個字符串中有這個數字:

char a[16]="F32FC0F5EC894E16" 

如何將其轉換爲十六進制數字並以類似於上面的變量's'的方式使用它?

回答

0

如果十六進制數字的數量總是偶數,並且字符串是大寫的,那麼算法很簡單。注意,不存在對異常或錯誤的控制。這只是一個基本的算法。

void hexCharsToBinary (char* a, int length, char* s) 
{ 
    int i; 
    for(i=0; i< length; i++) 
    { 
     char mask = (i&1)? 0xf0 : 0x0f ; 
     char charVal = ((*(a+i)>='0'&&*(a+i)<='9')?*(a+i)-'0':*(a+i)-'A'+10) ; 

     s[i>>1] = (s[i>>1]&mask) | charVal << ((i&1)?0:4) ; 
    } 

} 
+0

你應該輸入代碼混淆比賽...「那麼算法很容易......」**編輯**爲什麼檢查*(a + i)<='8'',而不是' = 9'? – Yuri

+0

@Yuri,是的,這是一個錯誤。我編輯了代碼。 – Gabriel

2

有此分配中的溢出:

char a[16]="F32FC0F5EC894E16" 

你沒有離開房間空終止。 char數組不必以null結尾,但字符串是,並且這是一個字符串聲明。不要爲使用硬編碼值初始化的變量聲明字符數組大小,請使用[]

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void hexString2byteStream (char *in, unsigned char *out, int len) { 
    char *p = in; 
    char byte[3] = { 0 }; 
    int i = 0; 

    while (sscanf(p, "%2s", byte)) { 
     out[i++] = strtoul(byte, NULL, 16); 
     if (i == len) break; 
     p += 2; 
    } 
} 

int main(void) { 
    char a[]="F32FC0F5EC894E16"; 
    unsigned char bs[8]; 
    int i; 

    hexString2byteStream(a, bs, sizeof(bs)); 

    for (i = 0; i < 8; i++) { 
     printf("%x\n", bs[i]); 
    } 

    return 0; 
} 

請注意,out不是以空字符結尾的字符串。

相關問題