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
Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge
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
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
!!!!!!!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!!!
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
Muss mich da mal durchkämpfen.
Danke im Voraus.
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 ".
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
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;
}
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
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;
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??
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
hä???
wie kopiere ich den Text ins char???
Von wo? Aus dem textfeld? Wie definiert (borland (typ?) oder WINAPI)?
mr.escape
die Zahlen aus dem Textfeld in das " ausg" char
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
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.
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
ausgs01 ist int
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
Nein, nur nach rechts schieben.
myMsg.DATA[4]=sbar01->Position & 255;
myMsg.DATA[5]=(sbar01->Position >>8) & 255;
mr.escape
ok thx funktioniert fuers erste