0

我有一个aa:bb:cc:dd:ee:ff需要解析为unsigned char[6]. 我正在使用 strtok 来获取每对字符,并且需要将它们转换为无符号字符,但我所做的一切都不起作用。

我已经尝试过(假设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
4

2 回答 2

0

假设您的输入字符串是一个最多包含两个十六进制数字的十六进制字符串,即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. 当直接读入 achar时,它只读取字符而不进行任何转换。

于 2012-04-21T18:00:37.037 回答
0

编译器将您正在做的事情视为将 32/64 位指针转换为 8 位数字。转换基本类型不会为您解释字符串的内容。

想一想:它怎么知道你具体想做什么?它怎么知道它是十六进制符号!

您正在尝试将包含十六进制值的字符串转换为数字。这是仅通过转换基本类型无法完成的转​​换。查看此问题的答案以获取建议。或者,由于您使用的是 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;

}
于 2012-04-21T18:25:33.310 回答