Ansistring in Hexadecimal wandeln und in char Array speichern
-
Hallo,
ich möchte in einem Editfeld eine Zahl schreiben und diese soll dann in Hexadecimal umgewandelt werden.
Das Problem ist allerdings, dass die Hex Zahl für eine Funktion benötigt wird, die einen char erwartet.Mein Problem ist nun :
Ich habe ein Editfeld, dies liefert mir einen AnsiString, dort wird nur eine Decimalzahl eingetragen. Diese Decimalzahl muß in Hexformat umgewandelt werden und darf nur ein char sein.AnsiString decZahl = Edit2->Text;
int fuenf = decZahl.ToInt();
HexwertByte6 = HexwertByte6.IntToHex(fuenf,1);
char senddata[3];
senddata[1]=0x02;
senddata[2]= HexwertByte6; // Hier soll nun der Hexwert vom Edit2 Feld stehenGruß
benny_1
-
Wie wäre es wenn du es einfach mit einer selbst geschriebenen Funktion castest?
zahl[1]=fuenf/16;
bittemp1=fmod(fuenf,16);
zahl[2]=zahl[1]/16;
bittemp2=fmod(zahl[1],16);if (bittemp1==16)
char[2]='f';
if (bittemp1==15)
char[2]='e';
if (bittemp1==14)
char[2]='d';
if (bittemp1==13)
char[2]='c';
if (bittemp1==11)
char[2]='b';usw. das gleiche für zahl[2] usw. und fertig.
PS. der Befehl heist int fuenf = IntToStr(Edit2->Text);
-
Mit printf kannste auf jeden fall eine Zahl in einen String bringen, den Rest bringste dann sicher auch noch hin.
#include "stdio.h" int sprintf(char *buffer, const char *format[, argument, ...]);
-
the_hero99 schrieb:
PS. der Befehl heist int fuenf = IntToStr(Edit2->Text);
Wieso? Die Verwendung von AnsiString::ToInt() oder AnsiString::ToIntDef(...) ist durchaus legitim.
@benny_1:
Möchtest möchtest den hexadezimalen Wert eines Integer in einem char?int zahl = Edit1->Text.ToInDef(0) // nur damit keine Exception geworfen wird... // eventuell Werteüberprüfung > -128 && < 128 char hexzahl = (char) zahl;Grüße Joe_M.
-
Hallo Joe_M,
dein Quellcode klappt ja einwandfrei. Jedoch nur bei Zahlen bis 31, ich möchte aber Zahlen bis 4096 verarbeiten können.
Kannst du mir dabei weiterhelfen?Gruß
benny_1
-
zufaulzumeinloggen schrieb:
the_hero99 schrieb:
PS. der Befehl heist int fuenf = IntToStr(Edit2->Text);
Wieso? Die Verwendung von AnsiString::ToInt() oder AnsiString::ToIntDef(...) ist durchaus legitim.
@benny_1:
Möchtest möchtest den hexadezimalen Wert eines Integer in einem char?int zahl = Edit1->Text.ToInDef(0) // nur damit keine Exception geworfen wird... // eventuell Werteüberprüfung > -128 && < 128 char hexzahl = (char) zahl;Grüße Joe_M.
Also erstmal kriegste so ganz bestimmt kein int in ein char, falls du das doch schaffst biste mein großer Held.

Dann zweitens sollteste wenigsten kein char sondern unsigned char nehmen, dann klapps auch mit dem Nachbarn bzw mit dem Umwandeln.
@benny Mit unsigned char klappts bis von 0 bis 255 und du darfst dich nicht von der Anzeige beim Auswerten beirren lassen. Es zählt was in der Variable steckt, nicht was der Debugger dir anzeigt.
Aso und was ich fast vergessen hätte, wenn ich ne Gültigkeitsprüfung der Zahl mache, dann bestimmt nicht mit ToIntDef(0) an der Stelle, was ist den wenn der User mal wirklih ne Null eingibt bzw. keine Zahl?
P.S. @ benny - es gint auch noch IntToHex(,) wenn dir das sprintf nicht gefällt.
-
benny_1 schrieb:
ich möchte aber Zahlen bis 4096 verarbeiten können.
benny_1, jetzt stiftet Deine ursprüngliche Frage etwas Verwirrung:
benny_1 schrieb:
Diese Decimalzahl muß in Hexformat umgewandelt werden und darf nur ein char sein.
Was genau meinst Du damit: Die Zahl soll in Form eines Zeichens dargestellt werden oder soll der Wertebereich der Zahl dem von char entsprechen (offenbar ja nicht) oder etwas ganz anderes ... ?
Bigwill schrieb:
Also erstmal kriegste so ganz bestimmt kein int in ein char, falls du das doch schaffst biste mein großer Held.
Wo ist das Problem?
Bigwill schrieb:
Dann zweitens sollteste wenigsten kein char sondern unsigned char nehmen, dann klapps auch mit dem Nachbarn bzw mit dem Umwandeln.
Warum? Worauf beziehst Du diese Aussage?
Bigwill schrieb:
Aso und was ich fast vergessen hätte, wenn ich ne Gültigkeitsprüfung der Zahl mache, dann bestimmt nicht mit ToIntDef(0) an der Stelle, was ist den wenn der User mal wirklih ne Null eingibt bzw. keine Zahl?
Tja, es passiert überhaupt nichts. Das ist ja auch der Sinn der Sache. In diesen Fällen wird eben der Vorgabewert 0 verwendet.
Das ist doch nur eine Möglichkeit, die Eingabe zu überprüfen.
Du kannst natürlich auch ToIntDef(-1234567) verwenden, wenn Du eine DAU-Meldung wie "Achtung, 'Ägypten' ist keine gültige Zahl." ausgeben willst.
-
dschensky schrieb:
Wo ist das Problem?
Ich würde sagen im Wertebereich und entsprechend in der Größe. Ist aber net so schlimm, da hab ich extra ein Smilley hintergesetzt, weils ja ansich nix mit der Lösung zu tun hat. Da er ja augenscheinlich nur den Wertebereich des char aus dem int braucht.
dschensky schrieb:
Warum? Worauf beziehst Du diese Aussage??
Das beziehe ich auf seine Umwandlung. Er hat angegeben Wertbereichsprüfung wehen char > -128 && < 128. So nun mach mal die Umwandlung mit einer -40. Was da in der Hex steht 0xD8 hat so ungefähr nix mit einer -40 als Hex zu tun, weil der halt so nur vom der obersten Bereichsgrenze 40 nach unten geht. Machst du das hingegen mit unsigned char von 0 - 255 dann stimmts. Da gibts nämlich keine -40;
dschensky schrieb:
Tja, es passiert überhaupt nichts. Das ist ja auch der Sinn der Sache. In diesen Fällen wird eben der Vorgabewert 0 verwendet.
Hab ich mich ein bissel falsch ausgedrückt. Wie willst du so unterscheiden ob der User nur eine 0 oder wirklich was falsches eingegeben hat. So jedenfalls nicht, darauf wollte ich aufmerksam machen. Sicher gibts da ne menge andere Möglichkeiten der Überprüfung und eine von den anderen, sollte man dann halt nutzen.
@benny also 4096 passt auch definitiv nicht in einen char
-
Bigwill schrieb:
... Umwandlung mit einer -40. Was da in der Hex steht 0xD8 hat so ungefähr nix mit einer -40 als Hex zu tun, weil der halt so nur vom der obersten Bereichsgrenze 40 nach unten geht. Machst du das hingegen mit unsigned char von 0 - 255 dann stimmts. Da gibts nämlich keine -40;
Ach ja, dann probier das mal:
char ctest; int itest = -40; ctest = (char) itest; int itest2 = (int) ctest; if (itest2 == itest) ShowMessage("Identisch");Und ja, in diesem Kontext ist der Vorgabewert 0 vielleicht nicht besonders sinnvoll. Aber es ging mir nur darum zu zeigen, wie man eine Exception vermeiden kann, sollte mal keine Zahl in das Edit getippt werden. Wie man eigentlich auch aus dem Kommentar in der betreffenden Zeile erkennen kann.
Um den Wert 4096 (0x1000) in einem char(-Array) abzubilden, mußt Du High- und Lowbyte vewenden, also zwei Byte (= zwei char). Um die Zeichenfolge 4096 darzustellen benötigst du 4 Byte. Bitte nicht vergessen, dass ein char abschließend immer noch ein \0 benötigt.
-
Joe_M. schrieb:
Ach ja, dann probier das mal:
char ctest; int itest = -40; ctest = (char) itest; int itest2 = (int) ctest; if (itest2 == itest) ShowMessage("Identisch");Super Beweisführung die du da hast.

Aber ich will deswegen keinen Streit vom Zaun brechen.
Aber vielleicht kannste meinen Standpunkt am ehesten mit dem Taschenrechner von Windows nachvollziehen, die machen nämlich den gleichen, aus meiner Sicht, Quatsch.Gib da mal dezimal -40 ein. Das nach hex wandeln. Ergebnis D8. Das zurück nach Dez. Ergebnis 216. Also ist 216 = -40
. Und genau das machst du wenn du eine (signed) char in eine unsigned Hex umwandelst.
-
ja aber genau da kommt signed und unsigned ins Spiel. char kennt nun mal nur 256 'Zustände', die ändern sich ja nicht, nur die Interpretation...
Grüße
Joe_M.