2012-04-21 28 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; 

}