Ich habe ein char [], das einen Wert wie "0x1800785" enthält, aber die Funktion, die ich den Wert geben möchte, erfordert ein int, wie kann ich dies in ein int konvertieren? Ich habe gesucht, kann aber keine Antwort finden. Vielen Dank.Hexadezimalstring (char []) in int umwandeln?
Antwort
Haben Sie versucht strtol()
?
strtol - convert string to a long integer
Beispiel:
const char *hexstring = "abcdef0";
int number = (int)strtol(hexstring, NULL, 16);
Bei der String-Darstellung der Zahl mit einem 0x
Präfix beginnt, einen muss sollte 0 als Basis verwenden:
const char *hexstring = "0xabcdef0";
int number = (int)strtol(hexstring, NULL, 0);
(Es ist auch möglich, eine explizite Basis wie 16 anzugeben, aber ich würde die Einführung von Redundanz nicht empfehlen y.)
Perfekt gearbeitet, danke – kizyle502
Wenn der Hexstring immer durch ein "0x" 'wie in der Frage angegeben eingeführt wird, sollte man' 0' anstelle von '16' verwenden. –
Danke, das Beispiel auf [dieser Seite] (http://www.cplusplus.com/reference/cstdlib/strtol/) ist sehr detailliert. –
Angenommen, Sie meinen, es ist eine Zeichenfolge, wie wäre es mit strtol?
Warum runter, das ernst? –
Ich hatte ursprünglich mit strtod (-> double) statt strtol verbunden. Ich nehme an, jemand hat es gesehen, während ich es bearbeitet habe. –
Nun, das ist kein großer Fehler ... der Compiler gibt den Rückgabewert automatisch aus, wenn er einem 'int' zugeführt wird. +1, BTW. –
Etwas Ähnliches könnte nützlich sein:
char str[] = "0x1800785";
int num;
sscanf(str, "%x", &num);
printf("0x%x %i\n", num, num);
lesen man sscanf
ich einen librairy gemacht Hexadezimal/Dezimal-Umwandlung ohne die Verwendung von stdio.h
zu machen. Sehr einfach zu bedienen:
unsigned hexdec (const char *hex, const int s_hex);
Vor der ersten Umwandlung intialize Array mit:
void init_hexdec();
Hier der Link auf GitHub: https://github.com/kevmuret/libhex/
unter Codeblock Versuchen, seine Arbeits für mich.
char *p = "0x820";
uint16_t intVal;
sscanf(p, "%x", &intVal);
printf("value x: %x - %d", intVal, intVal);
Ausgang ist:
value x: 820 - 2080
i eine ähnliche Sache getan haben, denken, dass es u helfen könnte, sein wirklich für mich arbeiten
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;}}
hier ich nur eine Reihe von genommen haben 8 Charaktere. Wenn du willst, dass du ähnliche Logik für 'a' zu 'f' hinzufügen kannst, um ihre entsprechenden hex Werte zu geben, habe ich das nicht getan, weil ich es nicht gebraucht habe.
Oder wenn Sie Ihre eigene Implementierung haben wollen, schrieb ich diese schnelle Funktion als Beispiel:
/**
* 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;
}
Verwenden xtoi (stdlib.h). Die Zeichenfolge hat als erste zwei Indizes "0x", also trimmen Sie val [0] und val [1] aus, indem Sie xtoi & val [2] senden.
xtoi(&val[2]);
So, nach einer gewissen Zeit des Suchens, und herauszufinden, dass strtol ist ziemlich langsam, ich habe meine eigene Funktion codiert. Es funktioniert nur für Großbuchstaben auf Buchstaben, aber das Hinzufügen von Kleinbuchstaben ist kein Problem.
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;
}
Verbrauch:
char *someHex = "#CCFF00FF";
int hexDevalue = hexToInt(someHex, 1, 8);
1, weil die hex wir beginnt konvertieren möchten Offset 1 und 8, weil es die Hex-Länge ist.
Speedtest (1.000.000 Anrufe):
strtol ~ 0.4400s
hexToInt ~ 0.1100s
- 1. Int zu Hexadezimalstring
- 2. Kann ich ein unsigned char * in einen unsigned int * umwandeln?
- 3. Convert char * in int
- 4. Typecasting int in char *
- 5. JAVA Hexadezimalstring
- 6. Swift: Index in Int umwandeln
- 7. Decode Hexadezimalstring in Ruby
- 8. C++ Char-Array zu Int und Int zu Char-Array
- 9. Scala char Umwandlung in int
- 10. Konvertieren von int in char?
- 11. Konvertieren eines char * in int
- 12. Konvertieren von char in int?
- 13. Int zu Char in C#
- 14. Anzeige Char, die in Char-Array als int Wert
- 15. Convert int const char *
- 16. int char Array
- 17. Wie kann man in C++ int umwandeln?
- 18. Kann ich long in int umwandeln?
- 19. Konvertierung in Char/String von Ascii Int in Swift
- 20. Wie kann static_cast einen int in char umwandeln, aber nicht reinterpret_cast?
- 21. Wie kann ich einen int-Wert in einen generischen Typparameter umwandeln, der äquivalent ist wie char?
- 22. Cast int in char-Array in C
- 23. In C# warum (char) (1) + (char) (2) ergibt int 3
- 24. sizeof ((int) (Gleitkommazahl) (char) i)) wenn int definiert ist (int) (Gleitkommazahl) (char) i;
- 25. Ein int an char anhängen *
- 26. Java char array to int
- 27. int zu string, char * itoa
- 28. C Vergleich char und int
- 29. Umgehen von "int main (int argc, char ** argv)" in SDL2
- 30. Ist int von char zuweisbar?
Sicherlich ist dies ein Duplikat ... –
möglich Duplikat [string in signed int konvertieren] (http://stackoverflow.com/questions/3792610/ convert-string-in-signed-int) – bitmask