2013-08-15 4 views
0

У меня есть буквальное значение, которое должно храниться в массиве unsigned char[64]. Как я могу преобразовать такие значения в шестнадцатеричный эквивалент?Как преобразовать значение шестнадцатеричного символа в шестнадцатеричное значение?

int main() { 

    unsigned char arry[1] = { 0xaa } 

    char* str = "fe"; //I want to store 0xfe on arry[0] 

    arry[0] = 0xfe; // this works, but I have to type it 
    arry[0] = 0x + str; //obviously fails 

    return 0; 
} 

Любые указатели?

+0

Вы спрашиваете, как разобрать строку как число. Используйте 'sscanf'. – SLaks

+2

Посмотрите на 'strtol()'. – alk

+0

С 63 потенциальными цифрами в этом шестнадцатеричном номере, надеюсь, вы принесли библиотеку большого числа. – WhozCraig

ответ

0

Для каждого символа c, значение:

if ('0' <= c && c <= '9') return c - '0'; 
if ('a' <= c && c <= 'f') return c - 'a' + 10; 
if ('A' <= c && c <= 'F') return c - 'A' + 10; 

// else error, invalid digit character 

Теперь просто перебрать строки слева направо, суммированием цифр значений, и умножением полученного результата на 16 каждый раз.

(Это реализовано для вас стандартной библиотеки в strto*l функции с основанием 16)

+1

Если вы хотите сделать это, вам будет лучше передавать символ за один раз на strtol(). – Jiminion

+0

@ Jim: Два 'char's ... – alk

2
arr[0] = strtol(str,NULL,16); // If one entry is big enough to hold it. 
0

Использование функции strtol() для преобразования строки в длинное в конкретной базе: http://www.cplusplus.com/reference/cstdlib/strtol/

"Разбирает строчную строку str, интерпретирующую ее содержимое как целое число указанной базы, которое возвращается как значение long int. Если endptr не является нулевым указателем, функция также устанавливает значение endptr для указания на первое символ после номера ".

Пример:

#include <stdio.h>  /* printf */ 
#include <stdlib.h>  /* strtol */ 

int main() 
{ 
    char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff"; 
    char * pEnd; 
    long int li1, li2, li3, li4; 
    li1 = strtol (szNumbers,&pEnd,10); 
    li2 = strtol (pEnd,&pEnd,16); 
    li3 = strtol (pEnd,&pEnd,2); 
    li4 = strtol (pEnd,NULL,0); 
    printf ("The decimal equivalents are: %ld, %ld, %ld and %ld.\n", li1, li2, li3, li4); 
    return 0; 
} 
0

Сколотить произвольное решение длины и из.
Грустно Строка X многословна: досадное дело с не шестнадцатеричной строкой, нечетной длиной, слишком большой, и т.д.

#include <string.h> 
#include <stdio.h> 

// S assumed to be long enough. 
// X is little endian 
void BigXToString(const unsigned char *X, size_t Length, char *S) { 
    size_t i; 
    for (i = Length; i-- > 0;) { 
    sprintf(S, "%02X", X[i]); 
    S += 2; 
    } 
} 

int BigStringToX(const char *S, unsigned char X[], size_t Length) { 
    size_t i; 
    size_t ls = strlen(S); 
    if (ls > (Length * 2)) { 
    return 1; //fail, too big 
    } 
    int flag = ls & 1; 
    size_t Unused = Length - (ls/2) - flag; 
    memset(&X[Length - Unused], 0, Unused); // 0 fill unused 
    char little[3]; 
    little[2] = '\0'; 
    for (i = Length - Unused; i-- > 0;) { 
    little[0] = *S++; 
    little[1] = flag ? '\0' : *S++; 
    flag = 0; 
    char *endptr; 
    X[i] = (unsigned char) strtol(little, &endptr, 16); 
    if (*endptr) return 1; // non-hex found 
    if (*S == '\0') break; 
    } 
    return 0; 
} 

int main() { 
    unsigned char X[64]; 
    char S[64 * 2 + 2]; 
    char T[64 * 2 + 2]; 
    strcpy(S, "12345"); 
    BigStringToX(S, X, sizeof(X)); 
    BigXToString(X, sizeof(X), T); 
    printf("'%s'\n", T); 
    return 0; 
} 
Смежные вопросы