2012-04-21 26 views
0

我有一個字符數組(像aa:bb:cc:dd:ee:ff這樣的以太網地址),我需要解析成unsigned char[6]。我使用strtok來獲取每個字符對,並且我需要將它們轉換爲一個無符號字符,但是我所做的一切都沒有發揮作用。將char *長度2轉換爲無符號字符的正確方法?

我嘗試(假設c是長度爲2的一個char *):

unsigned char t = (unsigned char)c; // gives "loses precision" error 

unsigned char* t = (unsigned char*)c; 
unsigned char t1 = t[0];     // gives the wrong value 

unsigned char t; 
strcpy((char*)t, c);  // gives the wrong value 
strncpy((char*)t, c, sizeof(char)*2) // gives the wrong value 
+0

「c」是如何定義的?你的'strncpy'代碼也有錯誤。 – 2012-04-21 17:44:59

+0

@macs固定。往上看。 – xdumaine 2012-04-21 17:46:05

+2

你試過['strtoul(c,NULL,16)'](http://www.cplusplus.com/reference/clibrary/cstdlib/strtoul/)嗎?它可能會給你「失去精度」的警告,但會產生一個無符號整數(第一個令牌的值爲'0xAA'等)。 – DCoder 2012-04-21 17:47:27

回答

0

假設你的輸入字符串爲含有至多兩個十六進制數十六進制字符串,我。即FF可以使用std::stringstream做轉換:

int n; 

std::stringstream ss; 
ss << std::hex << c; 
ss >> n; 

unsigned char x = (unsigned char)n; 

你必須保證,那真的c不大於FF更大。

EDIT:改變上述代碼讀取值變成第一一個int,然後將其澆鑄到unsigned char。當直接讀入char時,它只讀取字符而沒有任何轉換。

+0

'std :: hex'不會影響字符串的插入。你的意思是'ss >> std :: hex >> n;'?我不認爲這是可行的:( – 2012-04-21 18:01:34

+0

嗯,只是在SO發現另一個參考:[C + +十六進制字符串轉換爲有符號整數](http://stackoverflow.com/questions/1070497/c-convert-hex-string- – 2012-04-21 18:03:27

+0

@BenVoigt我再次測試過它,它的工作原理,但是ss >> n'的變量必須是一個整數(作出解釋編輯)。 – 2012-04-21 18:11:00

0

編譯器會將32/64位指針指向8位數字,以瞭解您正在做什麼。投射基本類型不會爲您解釋字符串的內容。

想一想:它會怎麼知道你特別想做什麼?它如何知道它是十六進制符號!

您試圖將包含十六進制值的字符串轉換爲數字。這是一種轉換,你只需投射基本類型就無法做到。請看this問題的回答以獲得建議。或者,因爲你使用C++,你可以使用我認爲更好一點的流。示例:

#include <sstream> 
#include <iostream> 
#include "stdio.h" 

int main(int argc, char* argv[]) 
{ 
    char *addr[] = { "aa", "bb", "cc", "dd", "ee", "ff" }; 
    unsigned char binaddr[6]; 
    for(size_t i = 0; i < 6; ++i) 
    { 
     size_t word_result; 
     std::istringstream addr_stream(addr[i]); 
     addr_stream >> std::hex >> word_result; 
     binaddr[i] = word_result; 
    } 
    printf("%x:%x:%x:%x:%x:%x\n", binaddr[0], binaddr[1], binaddr[2], binaddr[3], binaddr[4], binaddr[5]); 
    return 0; 

}