cast array c char int

array - Convertir cadena hexadecimal(char[]) a int?



int to char ansi c (10)

Algo como esto podría ser útil:

char str[] = "0x1800785"; int num; sscanf(str, "%x", &num); printf("0x%x %i/n", num, num);

Leer hombre sscanf

Tengo un char [] que contiene un valor como "0x1800785" pero la función a la que deseo dar el valor requiere un int, ¿cómo puedo convertir esto a un int? He buscado pero no puedo encontrar una respuesta. Gracias.


Entonces, después de un tiempo de búsqueda, y descubriendo que strtol es bastante lento, he codificado mi propia función. Solo funciona en letras mayúsculas, pero agregar funcionalidad en minúsculas no es un problema.

int hexToInt(PCHAR _hex, int offset = 0, int size = 6) { int _result = 0; DWORD _resultPtr = reinterpret_cast<DWORD>(&_result); for(int i=0;i<size;i+=2) { int _multiplierFirstValue = 0, _addonSecondValue = 0; char _firstChar = _hex[offset + i]; if(_firstChar >= 0x30 && _firstChar <= 0x39) _multiplierFirstValue = _firstChar - 0x30; else if(_firstChar >= 0x41 && _firstChar <= 0x46) _multiplierFirstValue = 10 + (_firstChar - 0x41); char _secndChar = _hex[offset + i + 1]; if(_secndChar >= 0x30 && _secndChar <= 0x39) _addonSecondValue = _secndChar - 0x30; else if(_secndChar >= 0x41 && _secndChar <= 0x46) _addonSecondValue = 10 + (_secndChar - 0x41); *(BYTE *)(_resultPtr + (size / 2) - (i / 2) - 1) = (BYTE)(_multiplierFirstValue * 16 + _addonSecondValue); } return _result; }

Uso:

char *someHex = "#CCFF00FF"; int hexDevalue = hexToInt(someHex, 1, 8);

1 porque el hexágono que queremos convertir comienza en el desplazamiento 1, y 8 porque es la longitud hexagonal.

Speedtest (1.000.000 de llamadas):

strtol ~ 0.4400s hexToInt ~ 0.1100s


He hecho algo similar, creo que podría ser útil si realmente está trabajando para mí

int main(){ int co[8],i;char ch[8];printf("please enter the string:");scanf("%s",ch);for(i=0;i<=7;i++){if((ch[i]>=''A'')&&(ch[i]<=''F'')){co[i]=(unsigned int)ch[i]-''A''+10;}else if((ch[i]>=''0'')&&(ch[i]<=''9'')){co[i]=(unsigned int)ch[i]-''0''+0;}}

aquí solo he tomado una cadena de 8 caracteres. si quieres puedes agregar una lógica similar para ''a'' a ''f'' para dar sus valores hexadecimales equivalentes, no he hecho eso porque no lo necesitaba.


Hice una librairy para hacer conversión Hexadecimal / Decimal sin el uso de stdio.h . Muy simple de usar:

unsigned hexdec (const char *hex, const int s_hex);

Antes de la primera conversión, inicialice la matriz utilizada para la conversión con:

void init_hexdec ();

Aquí el enlace en github: https://github.com/kevmuret/libhex/


O si desea tener su propia implementación, escribí esta función rápida como un ejemplo:

/** * hex2int * take a hex string and convert it to a 32bit number (max 8 hex digits) */ uint32_t hex2int(char *hex) { uint32_t val = 0; while (*hex) { // get current character then increment uint8_t byte = *hex++; // transform hex character to the 4bit equivalent number, using the ascii table indexes if (byte >= ''0'' && byte <= ''9'') byte = byte - ''0''; else if (byte >= ''a'' && byte <=''f'') byte = byte - ''a'' + 10; else if (byte >= ''A'' && byte <=''F'') byte = byte - ''A'' + 10; // shift 4 to make space for new digit, and add the 4 bits of the new digit val = (val << 4) | (byte & 0xF); } return val; }


Prueba debajo del bloque de código, funciona para mí.

char *p = "0x820"; uint16_t intVal; sscanf(p, "%x", &intVal); printf("value x: %x - %d", intVal, intVal);

La salida es:

value x: 820 - 2080


Sé que esto es muy viejo, pero creo que las soluciones parecían demasiado complicadas. Prueba esto en VB:

Public Function HexToInt(sHEX as String) as long Dim iLen as Integer Dim i as Integer Dim SumValue as Long Dim iVal as long Dim AscVal as long iLen = Len(sHEX) For i = 1 to Len(sHEX) AscVal = Asc(UCase(Mid$(sHEX, i, 1))) If AscVal >= 48 And AscVal <= 57 Then iVal = AscVal - 48 ElseIf AscVal >= 65 And AscVal <= 70 Then iVal = AscVal - 55 End If SumValue = SumValue + iVal * 16 ^ (iLen- i) Next i HexToInt = SumValue End Function


Suponiendo que te refieres a que es una cadena, ¿qué hay de strtol ?


Use xtoi (stdlib.h). La cadena tiene "0x" como los dos primeros índices, de modo que recorte val [0] y val [1] off enviando xtoi & val [2].

xtoi( &val[2] );


¿Has probado strtol() ?

strtol - convertir cadena en un entero largo

Ejemplo:

const char *hexstring = "abcdef0"; int number = (int)strtol(hexstring, NULL, 16);

En caso de que la representación de cadena del número comience con un prefijo 0x , uno debe usar 0 como base:

const char *hexstring = "0xabcdef0"; int number = (int)strtol(hexstring, NULL, 0);

(También es posible especificar una base explícita como 16, pero no recomendaría introducir redundancia).