IntToHex() Fehlerhaft bei BCB? Hilfe!
-
Hallo,
probiert mal folgenden Code aus, per Button-Click:
void __fastcall TForm1::Button1Click(TObject *Sender) { char* die = new char[1]; die = "§"; ShowMessage(IntToHex(die[0],2)); die = 0; delete die; }
bei mir kommt dann: FFFFFFA7,
obwohl Digits auf 2 steht, mit anderen zeichen (a-Z0-9._-etc) geht es,
nur bei einigen sonderzeichen nicht.
Woran kann das liegen???gruß promicha
-
NACHTRAG:
man kann das Natürlich umgehen, in etwa so:
void __fastcall TForm1::Button1Click(TObject *Sender) { char* die = new char[1]; die = "§"; AnsiString tmp = IntToHex(die[0],2); if (tmp.Length() > 2) { tmp = tmp.SubString(tmp.Length()-1,2); } ShowMessage(tmp); die = 0; delete die; }
Aber das ist sicher nicht der Sinn der Sache, oder?
gruß promicha
-
Hallo,
ich habe das mal so ausprobiert:int idie = '§'; ShowMessage(IntToHex(idie, 2));
mit dem gleichen Ergebnis, das Problem liegt wohl in der Zuweisung, weil sich hinter '§' nicht 0xA7 versteckt, sondern eben die Zahl die dort angezeigt wird, also kein Fehler von IntToHex.
mfg SoftHall
-
folgendes funzt:
byte die = char('§'); ShowMessage(IntToHex(die,2));
-
promicha schrieb:
. . char* die = new char[1]; die = "§"; . . die = 0; delete die; . .
????????????????????????
Wer macht denn sowas ???????????????1. Speichr reservieren
2. Zeiger kaputt machen ???????????? (durch zuweisen einer Adresse
3. KAPUTTEN Zeiger für delete nehmen ???PS: Auf welche RAM- Adresse zeigt Variable 'die' nach
die="§";
Das solltest Du mal klären!!!(Nachlesen der Grundlagen!!!)
-
promicha schrieb:
Woran kann das liegen???
Zwei Anmerkungen dazu:
1. Es liegt an der Umwandlung von char auf int.
Wenn man mal spaßeshalber den Code folgendermaßen abändertvoid __fastcall TForm1::Button1Click(TObject *Sender) { char die = '§'; int iDie = die; ShowMessage(IntToHex(iDie,2)); }
und mal debuggt, kann man sehen, daß iDie den Wert -89 anstatt 169 hat.
Das liegt daran, daß char vorzeichenlos ist und bei der Umwandlung das
höchste Bit als Vorzeichen interpretiert wird.2. Man bekommt mit dem ursprünglichen Code einen Speicherleck, da "die"
per delete freigegeben wird, nachdem es zuvor auf 0 gesetzt wurde.Gruß,
Alexander
-
Und so wäre es richtig (wenn auch überumständlich), und liefert das was du erwartest:
void __fastcall TForm1::Button1Click(TObject *Sender) { unsigned char* die = new unsigned char[2]; strcpy(die, "§"); ShowMessage(IntToHex(die[0],2)); delete[] die; //editiert }
-
Alexander Kempf schrieb:
promicha schrieb:
Woran kann das liegen???
[...]kann man sehen, daß iDie den Wert -89 anstatt 169 hat.
Das liegt daran, daß char vorzeichenlos ist...äh, falsch.
Alexander Kempf schrieb:
und bei der Umwandlung das
höchste Bit als Vorzeichen interpretiert wird.Das wiederum ist richtig.
äh geo... an deiner angeblich richtigen lösung... fehlt da nicht ne Kleinigkeit in der delete-zeile?
-junix
-
junix schrieb:
Alexander Kempf schrieb:
[...]
Das liegt daran, daß char vorzeichenlos ist...äh, falsch.
Tja, stimmt. Es gibt auch signed char.
Wenn man den Ausdruck im Debugger untersucht, zeigt er halt 169 an,
was die Interpretation nahe legt, daß char unsigned ist (oder zumindest
hier so interpretiert wird).
Mag sein, daß ich da was falsch verstehe. Wenn's mir jemand erklären
könnte, wäre ich aber dankbar.Gruß,
Alexander
-
Leider interpretiert der Debugger bzw. das WatchWindow auch nur die Daten so wie du ihm sagst, solle er sie interpretieren. Siehe dazu auch die BCB Hilfe zum Thema "char":
By default, signed char is assumed
-junix
-
junix schrieb:
Leider interpretiert der Debugger bzw. das WatchWindow auch nur die Daten so wie du ihm sagst, solle er sie interpretieren. Siehe dazu auch die BCB Hilfe zum Thema "char":
By default, signed char is assumed
-junix
Darauf hätte ich ja eigentlich auch selbst kommen können.
Danke,
Alexander
-
Hi Leute,
so mal abgesehen von dem kaputten Zeiger, war natürlich nicht richtig
lag darann das ich mir nen Code-Schnippel kopiert habe, von jemanden der
mal einen HEX-Editor schrieb, beim Löschen einiger zeilen und umschreiben
lies ich das umüberlegt so stehen.Wie auch immer, also das mit dem Vorzeichen ist mir schon klar, aber
warum nur bei diesem Zeichen und vieleicht ein paar andere, merkwürdig ist
doch das andere Zeichen Funktionieren die auch höher als 127 liegen?Ich prüfe gleich noch mal einige Zeichen, die gestern gingen ob die wirklich
drüber liegen, aber ich meine schon.Das Beispiel von Geo ist wohl am besten mit strcpy()
unsigned char* die = new unsigned char[2]; strcpy(die, "§"); ShowMessage(IntToHex(die[0],2)); delete[] die;
Nun gut, ich will ja kein Hex-Editor, sondern ich will nur einige Zeichen, welche nicht in eine URL dürfen als HEX wandeln, wie es der Browser macht,
da genügt mir strcpy() variante.bis denne
-
Hi,
oder einfach so ...char die = '§'; String hex = IntToHex((unsigned char)die, 2);
... unabhängig von irgend welchem Zeiger-Gewurschtel. Das lenkt nur ab.