2010-11-12 74 views
3

我有每2個字符代表十六進制值的字符串,例如:存儲在一個字節2個十六進制字符用C

unsigned char msg[] = "04FF"; 

我想用來存儲的「04」在字節FF在另一個字節?

的願望輸出應與此類似,

unsigned short first_hex = 0x04; 
unsigned second_hex = 0xFF; 

memcpy(hex_msg_p, &first_hex,1); 
hex_msg_p++; 
memcpy(hex_msg_p, &second_hex,1); 
hex_msg_p++; 

我的字符串是很長的,我真的想實現流程的自動化。

在此先感謝

回答

3

假設你的數據是有效的(ASCII碼,有效的十六進制字符,正確的長度),你應該可以做類似的事情。

unsigned char *mkBytArray (char *s, int *len) { 
    unsigned char *ret; 

    *len = 0; 
    if (*s == '\0') return NULL; 
    ret = malloc (strlen (s)/2); 
    if (ret == NULL) return NULL; 

    while (*s != '\0') { 
     if (*s > '9') 
      ret[*len] = ((tolower(*s) - 'a') + 10) << 4; 
     else 
      ret[*len] = (*s - '0') << 4; 
     s++; 
     if (*s > '9') 
      ret[*len] |= tolower(*s) - 'a' + 10; 
     else 
      ret[*len] |= *s - '0'; 
     s++; 
     *len++; 
    } 
    return ret; 
} 

這會給你一個無符號字符數組,你負責釋放。它還會將len變量設置爲大小,以便您可以輕鬆處理。

它必須是ASCII的原因是因爲ISO只規定數字字符是連續的。所有投注均爲阿爾法。

4

unsigned char msg[] = { 0x04, 0xFF };

至於從字符串轉換,你需要閱讀的字符串,兩名字符在一個時間:

usigned char result; 
if (isdigit(string[i])) 
    result = string[i]-'0'; 
else if (isupper(string[i])) 
    result = string[i]-'A'; 
else if (islower(string[i])) 
    result = string[i]-'a'; 

mutiply 16和重複

+0

'在(string [I] - '0'<10U)結果=字符串[我] - '0'; else result =(string [i] | 32) - 'a';' – 2010-11-12 09:19:37

+0

@R由於所有的issomething函數都是宏(在大多數編譯器中),所以絕對不需要使用這種醜陋的代碼。 – 2010-11-12 09:30:52

2
int first_hex, second_hex; 

sscanf(msg,"%02X%02X", &first_hex, &second_hex); 

重要:first_hexsecond_hex和必須是int類型的使用像在本實施例中。

如果我理解你的權利,你想要做以下幾點:

char *pIn=msg; 
char *pOut=hex_msg; 
while(*pIn) 
{ 
    int hex; 
    if (*(pIn+1)==0) 
    { 
     // handle format error: odd number of hex digits 
     ... 
     break; 
    } 
    sscanf(pIn, "%02X", &hex); 
    *pOut++=(char)hex; 
    pIn+=2; 
}