Convertir cadena hexagonal a valor hexadecimal

Tengo una cuerda hexagonal grande

abcdef... 

y quiero convertirlo a

 0xab 0xcd 0xef 

¿Hay alguna función que haga eso?

Además, ¿podría decirme lo que quiero decir cuando las personas preguntan si esas entradas están en ASCII o no? abcdef se representan como una cadena. No estoy seguro si eso es ASCII o no. No estoy seguro de lo que significan. Soy muy nuevo en la progtwigción, así que la ayuda aquí sería apreciada. Tengo una cadena enorme que necesito usar en mi matriz y convertirla al formato antes mencionado me ayudará a inicializar mi matriz con la cadena hexadecimal.

Puedes hacer esto usando secuencias de cadenas.

 #include  #include  #include  int main( int , char ** ) { const char *str = "AFAB2591CFB70E77C7C417D8C389507A5"; const char *p1 = str; const char *p2 = p1; std::vector output; while( *p2 != NULL ) { unsigned short byte; ++p2; if( *p2 != NULL ) { ++p2; } std::stringstream sstm( std::string( p1, p2 ) ); sstm.flags( std::ios_base::hex ); sstm >> byte; output.push_back( byte ); p1 += 2; } for( std::vector::const_iterator it = output.begin(); it != output.end(); ++it ) { std::cout << std::hex << std::showbase << *it << "\t" << std::dec << std::noshowbase << *it << "\n"; } std::cout << "Press any key to continue ..."; std::cin.get(); } 

Tenga en cuenta que si utiliza caracteres unsigned char lugar de unsigned short la conversión de cadenas de caracteres intentará convertirlo en un carácter ASCII y no funcionará.

Lee cada carácter uno por uno y conviértelo en un valor hexadecimal (que es bastante fácil).

Luego debe, antes de leer el siguiente número, multiplicar el valor por 16 (o, de hecho, desplazarlo hacia la izquierda por 4) y leer el siguiente dígito antes de agregarlo al número que tiene hasta ahora. Sigue avanzando hasta llegar al final de la cuerda.

Cuando alguien pregunta si sus entradas son ASCII, se refieren a si su cadena hexadecimal está codificada utilizando la encoding ASCII. También existen otros métodos de encoding que van desde el obsoleto EBCDIC hasta el Unicode mucho más moderno (que tiene diferentes codificaciones que aún son unicode).

Tenga en cuenta que los números del 0 al 9, de la A a la F y de la A a la F tienen valores ASCII (o incluso Unicode) que están uno detrás del otro en la encoding. Entonces para los números puedes calcular su valor REAL haciendo “carácter – ‘0’”. Para 0 esto le dará 0 y hasta 9 le dará 9 …

El kit de piezas que necesitas en C es.

 for (..,i+=2) 

y

 strtoul(..,16) 

Aproximadamente lo siguiente (me gustaría poder hacerlo más corto y usar algunas funciones de la biblioteca, ¿alguna idea?):

La función string_to_vector toma una cadena de caracteres y su longitud como entrada. Recorre la cadena, procesando dos caracteres ( str[ i ] y str[ i + 1 ] ) a la vez. (Para los valores impares de n , la última pasada procesa solo un carácter (sin embargo, str[ i ] ). Cada carácter se convierte a un valor numérico utilizando el método hex_char_to_int. Luego construye un número al “unir” los dos valores numéricos desplazando y Finalmente, el valor numérico construido se agrega a un vector de valores numéricos que se devuelve al final de la función.

 std::vector< unsigned > string_to_vector( const char * str, size_t n ) { std::vector< unsigned > result; for( size_t i = 0; i < n; i += 2 ) { unsigned number = hex_char_to_int( str[ i ] ); // most signifcnt nibble if( (i + 1) < n ) { unsigned lsn = hex_char_to_int( str[ i + 1 ] ); // least signt nibble number = (number << 4) + lsn; } result.push_back( number ); } return result; } 

La siguiente función convierte los caracteres en el rango [0-9A-Za-z] al valor int sin signo correspondiente.

 unsigned hex_char_to_int( char c ) { unsigned result = -1; if( ('0' <= c) && (c <= '9') ) { result = c - '0'; } else if( ('A' <= c) && (c <= 'F') ) { result = 10 + c - 'A'; } else if( ('a' <= c) && (c <= 'f') ) { result = 10 + c - 'a'; } else { assert( 0 ); } return result; }