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).