2012-04-21 2 views
0

У меня есть массив символов (адрес ethernet, такой как aa:bb:cc:dd:ee:ff), что мне нужно разобрать на unsigned char[6]. Я использую strtok для получения каждой пары символов, и мне нужно отбросить их в unsigned char, но ничего, что я делаю, работает.Правильный способ преобразования char * length 2 в 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 
+0

Как произносится 'c'? Также есть ошибка в коде 'strncpy'. –

+0

@macs исправлено. см. выше. – xdumaine

+2

Вы пробовали ['strtoul (c, NULL, 16)'] (http://www.cplusplus.com/reference/clibrary/cstdlib/strtoul/)? Вероятно, это даст вам предупреждение «потеря точности», но приведет к получению целого числа без знака (со значением «0xAA» для первого токена и т. Д.). – DCoder

ответ

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. При чтении непосредственно в char он читает символы только без какого-либо преобразования.

+0

'std :: hex' не повлияет на вставку строки. Вы имели в виду 'ss >> std :: hex >> n;'? Я не думаю, что это работает :( –

+0

Hm, просто нашел другую ссылку в SO: [C++ конвертировать шестнадцатеричную строку в целое число со знаком] (http://stackoverflow.com/questions/1070497/c-convert-hex-string- to-signed-integer), который предлагает то же, что и я. –

+0

@BenVoigt Я проверил это снова, и он работает, но переменная для 'ss >> n' должна быть целым числом (сделано для пояснения). –

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; 

} 
Смежные вопросы