String in Hex-String wandeln - Komisch ...
-
kingruedi schrieb:
und beachtet doch den Hinweis mit dem size_t
void strtohex2(char *src, /**/size_t/**/ len) //<--!!!
Ist mittlerweile in meinem Code berücksichtigt. Und versuche auch in Zukunft daran zu denken.
Aber wieso soll man statt unsigned int size_t schreiben (oder bei int schon) ?
-
size_t solltest du immer nehmen, wenn du mit größen Angaben zu tun hast, weil es vom Standard her festgelegt ist, dass es die größte größe, die du im Speicher darstellen kannst aufnehmen können muss.
Wenn du int nimmst, passt das zB. auf IA32 Systemen nicht und du baust dir leicht die Möglichkeit eines Integer-Overflow Bugs ein. (siehe zB. http://www.whitefang.com/sup/secure-faq.html#INPUT2)
Aber leider sind die meisten Tutorial/Bücher Autoren zu unfähig das zu benutzen und so verbreitet sich diese "Seuche" weiter
-
kingruedi schrieb:
size_t solltest du immer nehmen, wenn du mit größen Angaben zu tun hast, weil es vom Standard her festgelegt ist, dass es die größte größe, die du im Speicher darstellen kannst aufnehmen können muss.
Gut, das ist verständlich bis auf größte Größe. Ist damit bei einem WinSystem 64 Bit gemeint oder bringe ich da jetzt total ewtas durcheinander und ein unsigned int == unigned long == unsigned __int32 ?
P.S.: unsigned int == unsigned long ist wohl nur bei MS Compilern so.
-
std::size_t ist bei 32Bit Systemen idr 32Bit groß, bei 64Bit Systemen aber 64Bit etc.
aus dem Grund gibt es eben den typedef
-
size_t ist zukunftsorientiert, heutige 32Bit compiler werden size_t wie schon erwähnt als unsigned int darstellen, 64bit compiler mit nem 64bit typ.
ziel von size_t ist einfach, dass heutiger code auf 64 bit compiler übernommen werden kann, die size_t anders definieren, ich würds mir grausig vorstellen, in einem vector alle unsigned ints in size_t umzuändern^^
-
nicht nur Zukunftsorientiert. Es gibt ja mehr als 32Bit und 64Bit
-
kingruedi schrieb:
nicht nur Zukunftsorientiert. Es gibt ja mehr als 32Bit und 64Bit
Als noch einmal zusammengefasst. size_t immer bei größeren Integer Typen verwenden.
Anfangs schriebst dukingruedi schrieb:
man nimmt size_t für längen Angaben und nicht int!
Meintest du da unsigned int oder ist es auch ratsam komplett auf Integer-Typen wie int/long zu "verzichten" und nur noch egal ob signed/unsigned size_t zu verwenden ?
-
size_t immer bei größeren Integer Typen verwenden.
Nein, size_t ist wie ich geschrieben habe und wie der Name sagt, für größen Angaben da.
size_t ist eben nur bei jeder Platform so, dass es die entsprechende größte größe aufnehmen kann. Auf 32Bit Platformen ist das idr. 32Bit, also auch nicht besonders groß.
Also size_t für Größen und int fürs rechnen oder so
-
kingruedi schrieb:
Also size_t für Größen und int fürs rechnen oder so
Alles klar. Danke schön.
-
HaJo. schrieb:
Optimizer schrieb:
Schau mal in die Java API. Die wenden in der Klasse Integer für die toString-Methoden wahnwitzige Tricks an, z.B. teilen sie nicht durch 16, sondern durch 16^2 und haben in einem array die ziffern für die 1er und die 16er des Rests abgelegt.
Wo kann ich denn den Source dazu einsehen ? Ich habe hier kein Java.
Dann könntest du es dir ja theoretisch ziehen. Da sind wirklich krasse Tricks dabei (zumindest beim 10er System, es gibt aber auch ne Methode toHexString()), ein Blick würde sich glaub ich lohnen.
Da haben sich schlaue Leute schon für dich Gedanken gemacht.
-
Hi,
In diesem Beitrag wurde das auch schon mal behandelt:
http://www.c-plusplus.net/forum/viewtopic.php?t=71870&postdays=0&postorder=asc&start=10const char array[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };std::string 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'; std::string ret_val = hex; delete hex; return ret_val; }unsigned%20long%20hexToULong(char%20*data){%20%20unsigned%20hex_length%20=%20std::strlen(data);%20%20unsigned%20long%20return_value%20=%200;%20%20for(unsigned%20int%20i%20=%200;%20i%20%3C%20hex_length;%20i++)%20%20{%20%20%20%20for(unsigned%20char%20j%20=%200;%20j%20%3C%2016;%20j++)%20%20%20%20{%20%20%20%20%20%20if(data[i]%20==%20array[j])%20%20%20%20%20%20%20%20{%20%20%20%20%20%20%20%20%20%20return_value%20=%20((return_value%20*%2016)%20+%20j);%20%20%20%20%20%20%20%20}%20%20%20%20}%20%20}%20%20return%20return_value;}http://www.c-plusplus.net/forum/viewtopic.php?t=71870&postdays=0&postorder=asc&start=10
MfG eV