Zeichen in hex-Ansicht
-
Ich würde gerne einen hex-editor oder wenigstens einen hex-viewer schreiben.
Da beim cast von char zu int nur ´ne dez-Zahl rauskommt wollte ich wissen ob´s eine Funktion zum dezimal->hex rechnen gibt. Oder muss ich die selbst schreiben?
-
Hi,
ich habe selbst mal 2 funktionen dafür geschrieben:
#include <string> const char array[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char *ULongTohex(unsigned long data) { unsigned long length = 0; if(data < 0xFF ) length = 2; else if(data < 0xFFFF && length != 2) length = 4; else if(data < 0xFFFFFF && length != 4) length = 6; else if(data < 0xFFFFFFFF && length != 6) length = 8; unsigned int reverse_counter = length; unsigned int *counter = new unsigned int[length]; unsigned int temp = 0; char *hex = new char [length+1]; for (unsigned int i= 0; i < length; i++) { temp = data % 16; data /= 16; data-temp; counter[i] = temp; } for(unsigned int i = 0; i< length ; i++) { hex[--reverse_counter] = (char)array[counter[i]]; } hex[length] = '\0'; return hex; } unsigned long hexToULong(char *data) { unsigned hex_length = std::strlen(data); unsigned long return_value = 0; for(unsigned int i = 0; i < hex_length; i++) { for(unsigned char j = 0; j < 16; j++) { if(data[i] == array[j]) { return_value = ((return_value * 16) + j); } } } return return_value; }
Ich hoffe das dir das weiter hilft.
MfG
eViLiSSiMo
-
@eViLiSSiMo:
du hast memory leaks.ich wuerde mir mal sprintf() ansehen, bzw. natuerlich auch stringstream
-
@ShadeOfMine:
char *ULongTohex(unsigned long data) { unsigned long length = 0; if(data < 0xFF ) length = 2; else if(data < 0xFFFF && length != 2) length = 4; else if(data < 0xFFFFFF && length != 4) length = 6; else if(data < 0xFFFFFFFF && length != 6) length = 8; unsigned int reverse_counter = length; unsigned int *counter = new unsigned int[length]; // Muss gelöscht werden! unsigned int temp = 0; char *hex = new char [length+1]; for (unsigned int i= 0; i < length; i++) { temp = data % 16; data /= 16; data-temp; counter[i] = temp; } for(unsigned int i = 0; i< length ; i++) { hex[--reverse_counter] = (char)array[counter[i]]; } hex[length] = '\0'; delete counter; // counter löschen -> MemLeak 1 return hex; }
Ok das eine hab ich gefunden aber wo sind die anderen *blind bin*
-
eViLiSSiMo schrieb:
Ok das eine hab ich gefunden aber wo sind die anderen *blind bin*
ersetze delte durch delete [] und es passt.
Das 'muss gelöscht werden' finde ich nicht gut - besser der aufrufer stellt den speicher bereit - denn manchmal ist es besser den speicher auf den stack zu legen als per new anzufordern, vorallem wenn man weiss, wieviel man braucht.
ausserdem kann man so ein delete[] recht leicht vergessen...
kurz gesagt: ich mag es nicht, wenn der caller delete aufrufen muss.
-
Hi,
Shade Of Mine schrieb:
Das 'muss gelöscht werden' finde ich nicht gut - besser der aufrufer stellt den speicher bereit - denn manchmal ist es besser den speicher auf den stack zu legen als per new anzufordern, vorallem wenn man weiss, wieviel man braucht.
ausserdem kann man so ein delete[] recht leicht vergessen...
kurz gesagt: ich mag es nicht, wenn der caller delete aufrufen muss.
dann ist das ja eine bessere Lösung sein oder?
char *ULongTohex(unsigned long data) { unsigned long length = 0; if(data < 0xFF ) length = 2; else if(data < 0xFFFF && length != 2) length = 4; else if(data < 0xFFFFFF && length != 4) length = 6; else if(data < 0xFFFFFFFF && length != 6) length = 8; unsigned int reverse_counter = length; unsigned int counter[8] = {0}; unsigned int temp = 0; char hex[9]; for (unsigned int i= 0; i < length; i++) { temp = data % 16; data /= 16; data-temp; counter[i] = temp; } for(unsigned int i = 0; i< length ; i++) { hex[--reverse_counter] = (char)array[counter[i]]; } hex[length] = '\0'; return hex; }
-
eViLiSSiMo schrieb:
dann ist das ja eine bessere Lösung sein oder?
Ne, das erzeugt undefiniertes verhalten: http://tutorial.schornboeck.net/referenz_return.htm
folgendes würde mir besser gefallen:
char *ULongTohex(unsigned long data, char* hex) { unsigned long length = 0; if(data < 0xFF ) length = 2; else if(data < 0xFFFF && length != 2) length = 4; else if(data < 0xFFFFFF && length != 4) length = 6; else if(data < 0xFFFFFFFF && length != 6) length = 8; unsigned int reverse_counter = length; unsigned int counter[8] = {0}; unsigned int temp = 0; for (unsigned int i= 0; i < length; i++) { temp = data % 16; data /= 16; data-temp; counter[i] = temp; } for(unsigned int i = 0; i< length ; i++) { hex[--reverse_counter] = (char)array[counter[i]]; } hex[length] = '\0'; return hex; }
-
Warum macht ihr es so kompliziert und erfindet das Rad neu, für was gibt es iomanip???
#include <iostream> #include <iomanip> using namespace std; int main() { int i = 1234; cout << hex << i << "\n" << dec << i; return 0; }
Ausgabe:
4d2 1234