Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

Konvertierung hex zu dec unetr Borland C++ 6.0

copykiller / 22 Antworten / Baumansicht Nickles

ich sollte bis zu vierstellige Hex-Zahlen in Dezimal-Zahlen umwandeln und umgekehrt(nicht unter Console).
Hätte vielleicht einer ne brauche Idee oder schon nen Source-Code!!

Thx im voraus

bei Antwort benachrichtigen
Andreas42 copykiller „Konvertierung hex zu dec unetr Borland C++ 6.0“
Optionen

Hi!

Ich hatte hier alles schonmal so schön für VB erklärt, wurde dann aber daruf gestossen ;-), dass es um VC++ ging und dass natürlich alles schon mit den alten C-Funktionen erschlagen wird.

Bis dann
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
mr.escape copykiller „Konvertierung hex zu dec unetr Borland C++ 6.0“
Optionen

Ist das teil einer produktiven aufgabe (dafür sieht es aber extrem primitiv aus, nicht als abwertung sondern primitiv in der wörtlichen bedeutung, also einfach, nicht komplex) oder soll damit im lehrbetrieb eine überprüfung des lehrstoffs erfolgen?

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
copykiller Nachtrag zu: „Konvertierung hex zu dec unetr Borland C++ 6.0“
Optionen

!!!!!!!Bin C++ Rookie!!!!!!

Das hat mir bisher auch net wirklich weitergeholfen.
Nochmals ne kurze Problemschilderung:

Ich erhalte zwei Hex-Werte als char zB 08 und 34 also zu 0834, füge diese mittels sprintf in einen Buffer zusammen. Der Wert im Buffer soll nun in Dezimal, also als " 2100 " an ein Textfeld übergeben werden.
Und nätürlich anders herum; Dezimal-Wert aus einem Textfeld einlesen und an einen Buffer als Hex zurückgeben.

Need Help!!!

bei Antwort benachrichtigen
mr.escape copykiller „!!!!!!!Bin C Rookie!!!!!! Das hat mir bisher auch net wirklich weitergeholfen....“
Optionen

In diesem besonderen fall, würde statt sprintf auch strcpy, strcat bzw. sogar strcpy, strcpy gehen, wenn man unbedingt die ganze hexzahl als eine zeichenkette haben möchte.
Also mit:
char ausg[32], *eing1="08", *eing2="34";
statt:
sprintf(ausg, "%s%s", eing1, eing2);
einfach
strcpy(ausg, eing1);
strcat(ausg, eing2);

oder noch einfacher, da die zeichenkettenlängen bekannt sind:
strcpy(ausg, eing1);
strcpy(ausg+2, eing2);

Nicht dass das hier eine besondere wirkung hat, aber spaßeshalber habe ich mal geschaut, wie es um die geschwindigkeit bestellt ist und sah, dass die sprintf-variante 20 mal und die strcpy/strcat-variante immer noch zwei mal so langsam ist, wie die doppelte strcpy-variante.
Danach mit:
int ergvar;
sscanf(ausg, "%x", &ergvar);

die zahl in die variable ergvar speichern.
Dieser teil geht aber noch einfacher, in dem die zeichenketten einzeln verarbeitet werden:
int ergvar, temp;
sscanf(eing1, "%x", &temp);
sscanf(eing2, "%x", &ergvar);
ergvar+=256*temp;


Die textuelle darstellung als dezimalzahl mit sprintf sollte danach keine zauberei mehr sein:
sprintf(ausg, "%d", ergvar);
Die zeichenkette in ausg muss dann im textfeld erscheinen.

Der weg zurück erfolgt sehr ähnlich, wobei nicht "%x", sondern "%d" in sscanf verwendet wird.
sscanf(ausg, "%d", &ergvar);//mit ergvar aus dem textfeld
Die umwandlung in die zwei ein-byte hex-zeichenketten erfolgt mit z.b.:
sprintf(ausg, "%02x", (ergvar>>8) & 255);
für den ersten teil bzw.
sprintf(ausg, "%02x", ergvar & 255);
für den zweiten.
"%02x" bedeutet, dass die ausgabe hexadezimal mit (mind.) zwei stellen und führenden nullen erfolgen soll.

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
copykiller Nachtrag zu: „Konvertierung hex zu dec unetr Borland C++ 6.0“
Optionen

Muss mich da mal durchkämpfen.

Danke im Voraus.

bei Antwort benachrichtigen
copykiller Nachtrag zu: „Konvertierung hex zu dec unetr Borland C++ 6.0“
Optionen

Ok soweit funktioniert das ja, aber wenn ich statt den Wert 08 und 34 nun ein Array zb
readMsg.DATA[4] oder sowas in der Art einbinden möchte, da ich in diesem meine Werte bekomme, erhalte ich bei gleichen Zahlenwerten als im Array [4]=34 und [5]=08 bei der Ausgabe nicht die " 2100 " sonder " 260 ".

bei Antwort benachrichtigen
mr.escape copykiller „Ok soweit funktioniert das ja, aber wenn ich statt den Wert 08 und 34 nun ein...“
Optionen

Wobei es nicht die "Werte 08 und 34" sind sondern die zeichenketten "08" und "34", die hier als hex-zahlen interpretiert werden (dezimal und bei der zweiten zahl auch oktal wären ebenso möglich)?
Wie ist denn readMsg.DATA genau definiert?
Als
char *DATA[ASIZE];
oder
char DATA[ASIZE];
oder
int DATA[ASIZE];
evtl. jeweils als unsigned?
Wobei ASIZE die feldgröße darstellt.
#define ASIZE 32

Woher kommt das leerzeichen vor den ausgabezahlen?
Was ist mit der reihenfolge der einzelwerte, was ist das höhere und was das niedrigere byte?

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
copykiller Nachtrag zu: „Konvertierung hex zu dec unetr Borland C++ 6.0“
Optionen

HiByte ist readMsg.DATA[5] und DATA[4] das LowByte

hier mal ne auszug ausm Header

typedef struct {
DWORD ID; // 11/29 Bit-Kennung
BYTE MSGTYPE; // Bits aus MSGTYPE_*
BYTE LEN; // Anzahl der gueltigen Datenbytes (0.8)
BYTE DATA[8]; // Datenbytes 0..7
} TPCANMsg;


und ein auszug ausm prog


TPCANMsg readMsg;
char buffer[100];
char buffer2[10];
char indexbuff[8];
char ibuff[8];
char ausg[5]={' ',' ',' ',' ',' '}, *einghi= &readMsg.DATA[5] , *einglow= &readMsg.DATA[4];
int ergvar, temp;


// Alle CAN Daten auslesen
while ((CAN_Read(&readMsg) & CAN_ERR_QRCVEMPTY)==0 )//Solange bis Buffer leer
{

if(readMsg.DATA[2]==0x20 && readMsg.DATA[1]==0x07 && readMsg.DATA[5]>0x00 && readMsg.DATA[4]>0x00){
strcpy(ausg, einghi);
strcpy(ausg+2, einglow);
sscanf(einghi, "%x", &temp);
sscanf(einglow, "%x", &ergvar);
ergvar+=256*temp;
sprintf(ausg, "%d", ergvar);

}
tfist01->Text= ausg;
}

bei Antwort benachrichtigen
mr.escape copykiller „HiByte ist readMsg.DATA 5 und DATA 4 das LowByte hier mal ne auszug ausm Header...“
Optionen

Das problem scheint hier aus einem missverständniss zu entstehen.
Der inhalt von readMsg.DATA[4] und readMsg.DATA[5] liegt schon als binäre information vor. Nur weil der variabletyp von einghi und einglow "char *" ist, wird aus dem referenzierten inhalt kein text (im sinne von nullterminierter klartext).
Statt:
char *einghi= &readMsg.DATA[5] , *einglow= &readMsg.DATA[4];
strcpy(ausg, einghi); //das hier ist redundant oder besser gesagt überflüssig
strcpy(ausg+2, einglow); //das auch!
sscanf(einghi, "%x", &temp);
sscanf(einglow, "%x", &ergvar);
ergvar+=256*temp;

reicht einfach:
ergvar=256*readMsg.DATA[5]+readMsg.DATA[4];

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
copykiller Nachtrag zu: „Konvertierung hex zu dec unetr Borland C++ 6.0“
Optionen

Kann mir jemand sagen wieso die �bergabe an das TF nicht funktioniert??


if(readMsg.DATA[2]==0x20 && readMsg.DATA[1]==0x07 && readMsg.DATA[3]==0x00){
imax = 256*readMsg.DATA[5]+readMsg.DATA[4];
}
if(imax =3200)
tfist01->Text= imax;

bei Antwort benachrichtigen
copykiller Nachtrag zu: „Kann mir jemand sagen wieso die ï ½bergabe an das TF nicht funktioniert?? if...“
Optionen

sorry das Problem hat sich erledigt war n Tippfehler mit den
" > und nun n�chstes Prob.
wie bekomm ich den Wert der in dem TF steht nun wieder gesplittet in die Arrays als Hex??

bei Antwort benachrichtigen
mr.escape copykiller „sorry das Problem hat sich erledigt war n Tippfehler mit den und nun nï...“
Optionen
int imax;
char ausg[32];//gross genug machen!
//hier text aus textfeld nach ausg kopieren, abbruch wenn fehler!
sscanf(ausg, "%d", &imax);//imax aus dezimalzahl umwandeln
//sscanf gibt die anzahl der erfolgreich verarbeiteten felder an (hier nur "%d"), fehlerbehandlung im vorfeld erforderlich
readMsg.DATA[4]=imax && 255;//1. byte
readMsg.DATA[5]=(imax>>8) && 255;//2. byte
//gäbe es noch mehr bytes, ginge es etwa so weiter:
readMsg.DATA[6]=(imax>>16) && 255;//3. byte
readMsg.DATA[7]=(imax>>24) && 255;//4. byte


mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
copykiller Nachtrag zu: „Konvertierung hex zu dec unetr Borland C++ 6.0“
Optionen

hä???

wie kopiere ich den Text ins char???

bei Antwort benachrichtigen
mr.escape copykiller „hä??? wie kopiere ich den Text ins char???“
Optionen
den Text?
Von wo? Aus dem textfeld? Wie definiert (borland (typ?) oder WINAPI)?

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
copykiller Nachtrag zu: „Konvertierung hex zu dec unetr Borland C++ 6.0“
Optionen

die Zahlen aus dem Textfeld in das " ausg" char

bei Antwort benachrichtigen
mr.escape copykiller „die Zahlen aus dem Textfeld in das ausg char“
Optionen

Mit der normalen WINAPI geht es etwa so:
UINT GetDlgItemText(
  HWND hDlg, // handle to dialog box
  int nIDDlgItem, // control identifier
  LPTSTR lpString, // pointer to buffer for text
  int nMaxCount // maximum size of string
);


Mit der MFC käme so etwas in frage:
CEdit::GetWindowText

und bei borland (aber nur geraten!) vielleicht das:
TControl::GetTextBuf

In den helpfiles sollte sich dazu einiges finden lassen.

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
copykiller Nachtrag zu: „Konvertierung hex zu dec unetr Borland C++ 6.0“
Optionen

hab das mal so versucht,da der Zahlenwert im Textfeld von einen Scollbar kommt.

char buf[5];
tfsoll01->Text = itoa(sbar01->Position, buf, 10);
ausgs01 = sbar01->Position;

da mir die ScrollBar Postion ja schon als Int übergeben wird.
Wenn ich dann aber das ganze aus die art versuche von

http://www.nickles.de/thread_cache/537883896.html

bekomme ich irgend einen Schrott in die Arrays myMsg.DATA[4]und[5].
oder kann ich die Int von den ScrollBar so nicht verwenden.

bei Antwort benachrichtigen
mr.escape copykiller „hab das mal so versucht,da der Zahlenwert im Textfeld von einen Scollbar kommt....“
Optionen
char buf[5]; //das ist viel zu klein!

ausgs01 = sbar01->Position; //was ist ausgs01?

bekomme ich irgend einen Schrott in die Arrays myMsg.DATA[4]und[5].
oder kann ich die Int von den ScrollBar so nicht verwenden.

Da sollte doch der debugger sehr schnell helfen können (breakpoint setzen und schritt für schritt testen). Wenn sbar01->Position stimmt, liegt es nur an der weiterverarbeitung, wenn nicht, liegt der fehler schon davor (dahinter kann es aber auch noch fehler geben, aber eins nach dem anderen).
Unter http://www.nickles.de/thread_cache/537883896.html steht nur, wie man, recht trivial, aus einer textform eine multibyte zahl auf einzelbytes aufteilt (byte-reihenfolge: little endian).

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
copykiller Nachtrag zu: „Konvertierung hex zu dec unetr Borland C++ 6.0“
Optionen

ausgs01 ist int

bei Antwort benachrichtigen
copykiller Nachtrag zu: „Konvertierung hex zu dec unetr Borland C++ 6.0“
Optionen

muss ich dann den int zahlenwert den ich durch den scrollbar bekomme in einen buffer schieben und hin dort gleich zu hex konvertieren,dann den buffer nehmen und um 8stellen nach rechts schieben um das high-byte zu bekommen

bei Antwort benachrichtigen
mr.escape copykiller „muss ich dann den int zahlenwert den ich durch den scrollbar bekomme in einen...“
Optionen

Nein, nur nach rechts schieben.

myMsg.DATA[4]=sbar01->Position & 255;
myMsg.DATA[5]=(sbar01->Position >>8) & 255;


mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
copykiller Nachtrag zu: „Konvertierung hex zu dec unetr Borland C++ 6.0“
Optionen

ok thx funktioniert fuers erste

bei Antwort benachrichtigen