将char * length 2转换为unsigned char的正确方法?

时间:2012-04-21 17:41:42

标签: c++ casting

我有一个字符数组(像aa:bb:cc:dd:ee:ff这样的以太网地址),我需要将其解析为unsigned char[6]。我正在使用strtok获取每对字符,我需要将它们转换为unsigned char,但我正在做的事情都没有。

我已经尝试过(假设c是长度为2的字符*):

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

2 个答案:

答案 0 :(得分:0)

假设您的输入字符串是一个包含最多两个十六进制数字的十六进制字符串,i。即FF您可以使用std::stringstream进行转换:

int n;

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

unsigned char x = (unsigned char)n;

您必须确保c确实不大于FF

编辑:更改了上述代码,首先将值读入int,然后将其转换为unsigned char。直接阅读char只读取字符而不进行任何转换。

答案 1 :(得分: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;

}