Help - i need somebody help..
Ich komme im Moment nicht weiter.
Ich habe eine Variable char [33] in der 32+1(\0) Zahlen
gespeichert werden. (65666768697071727374757677787980\0)
Diese Zahlen sollen dann in einer neuen Variablen char [16] als HEX
übertragen werden, dabei werden immer zwei Zahlen zu einem Paar
herangezogen und ein 0x davor geschrieben, sodass aus der Zahl 65 z.B.
0x65 wird. Dieses 0x65 dient dann später als Byte.
Beispiel:
Die Eingabe war:
char zahlen[33] = "65666768697071727374757677787980\0";
Jetzt stehen die Zahlen in der Variable.
Wie mache ich in einer Funktion das daraus:
int bufferhexwert[16] =
{0x65,0x66,0x67............................0x80};
sodass ich die Variable einer weiteren Funktion übergeben kann.
Mein Denkansatz ist wohl völlig verkehrt:
verzweifelt schrieb:> Mein Denkansatz ist wohl völlig verkehrt:
und warum? Was tut es, was tut es nicht und welche Fehlermeldung gibt
der Compiler?
Spontan würd ich auf das %i tippen. Für ganze Zahlen heißt das %d.
Außerdem meinst du sprintf (besser snprintf).
Aber das hat dir ja der Compiler beides bereits gesagt ;-)
verzweifelt schrieb:> Diese Zahlen sollen dann in einer neuen Variablen char [16] als HEX> übertragen werden, dabei werden immer zwei Zahlen zu einem Paar> herangezogen und ein 0x davor geschrieben
wenn du das als int speichern willst, dann gibt es kein 0x davor.
Das 0x ist eine Sache bei der Ausgabe, nicht mehr. Du kannst dir einen
Int ini jedem beliebigen Zahlensystem ausgeben lassen. Aber 5 irgendwas
sind immer 5 irgendwas, egal in welchem zahlensystem du sie darstellst.
> Die Eingabe war:> char zahlen[33] = "65666768697071727374757677787980\0";>> Mein Denkansatz ist wohl völlig verkehrt:
Schon. Aber auf einer ganz anderen Ebene als du vermutest
Wenn in deinen Ausgangsdaten nur die Hex-Ziffern '0' bis '9' vorkommen,
dann genügt diese einfache 'Umrechnung'. Wenn da allgemeine Hex-Zahlen
('0'-'9','A'-'F','a'-'f') vorkommen können, dann schreibst du dir am
besten eine Funktion, der du einen einzelnen char übergibst, und die den
numerischen Wert für diesen char liefert.
holger schrieb:>>Schon. Aber auf einer ganz anderen Ebene als du vermutest>> Du hast übersehen das er ASCII Zeichen benutzt.
Ich hab nachgebessert.
Danke für den Catch.
>>Schon. Aber auf einer ganz anderen Ebene als du vermutest>>Du hast übersehen das er ASCII Zeichen benutzt.
Verdammt da hast du ja fix noch einen edit nachgelegt;)
Lieben Dank in die nette Runde.
Da setze ich mich gleich noch mal an dem Rechner.
Die Eingabe ist eine einfache Eingabe für den
Benutzer ( MOdem, Terminal AT )
er müsste sonst \65\66\67... eingeben oder 0x65 0x66 0x67 ...
Die "Zeichen" Daten sollen dann an ein Int Array übergeben
werden das die Bytes 0x65 0x66 0x67 ... dann weiterverarbeiten kann.
Es kommen alle Hexwerte vor. 0x00 - 0xFF
Danke&Gruss
verzweifelt schrieb:> Lieben Dank in die nette Runde.> Da setze ich mich gleich noch mal an dem Rechner.> Die Eingabe ist eine einfache Eingabe für den> Benutzer ( MOdem, Terminal AT )> er müsste sonst \65\66\67... eingeben oder 0x65 0x66 0x67 ...
Warum 'müsste' er das. Da diese Codes ganz offensichtlich als ASCII
Zeichen zu einem Text gehören, warum kann er dann den Text nicht gleich
direkt eingeben?
Warum zwingst du ihn, dass er anstelle von zb des Textes "ATDT" dir die
entsprechenden ASCII Code angeben muss "41544454"
Dir scheint nicht klar zu sein, dass im COmputer alles ein Bitmuster ist
und nicht mehr.
Ob du schreibst
1
charc=65;
2
charc=0x41;
3
charc='A';
ist völllig Wurscht. Alle 3 Zeilen bedeuten dasselbe. In der Variablen c
wird das Bitmuster 01100101 abglegt. Der einzige Unterschied besteht
darin, wie ich dieses 'Bitmuster' spezifiziere. Je nachdem welcher
Aspekt im Vordergrund steht, entscheide ich mich für eine der
Schreibweisen. Die unterschiedlichen Schreibweisen sind eine Hilfe für
uns Menschen. Man wählt diejenige, die dem Problem am angemessesten ist.
Wenn mir der Benutzer eine Telefonnummer eingeben soll, dann lass ich
ihn die auch so eingeben, wie er sie gewohnt ist:
1
+49 555 86754
und nicht indem er mir die ASCII Codes für die einzelnen Zeichen aus
einer Tabelle raussuchen muss.
Karl Heinz schrieb:> Warum zwingst du ihn, dass er anstelle von zb des Textes "ATDT" dir die> entsprechenden ASCII Code angeben muss "65846884"
Danke Karl Heinz,
er muss auch das Zeichen (Byte) 0xFF eingeben, oder das 0x00, daher der
Umweg per "Morsezeichen". Bei 'Alphabet' Klartext ist das kein Problem.
Aber wie geagt, auch SOnderzeichen, eben einen Bytecode.
verzweifelt schrieb:> Karl Heinz schrieb:>> Warum zwingst du ihn, dass er anstelle von zb des Textes "ATDT" dir die>> entsprechenden ASCII Code angeben muss "65846884"> Danke Karl Heinz,> er muss auch das Zeichen (Byte) 0xFF eingeben, oder das 0x00, daher der> Umweg per "Morsezeichen". Bei 'Alphabet' Klartext ist das kein Problem.> Aber wie geagt, auch SOnderzeichen, eben einen Bytecode.
OK.
Aber warum dann ein int?
Der Datentyp um Bytes zu speichern ist das 'unsigned char'.
Karl Heinz schrieb:> OK.> Aber warum dann ein int?
Sehr berechtigte Frage, Karl Heinz!
Danke für den Hinweis!!
>> Der Datentyp um Bytes zu speichern ist das 'unsigned char'.
Ich schreibe später nochmal, ob ich es übersetzt bekommen habe.
Es waren wie immer sehr viele Infos zwischen den Zeilen von Euch, danke!
Habe wieder einige Denkanstösse und wertvolle Infos erhalten
Danke&Gruss!!!
Wie würde das aussehen wenn es alle Hexzahlen unterstützt, also auch a,
b, c, d, e, f.
Wenn der String "1234" wäre, liefert der code den richtigen Hex 0x12
Wenn der String "1A23" wäre, liefert der code den Hex Wert 0x21
Danke&Gruss
Karl Heinz schrieb:> Wenn in deinen Ausgangsdaten nur die Hex-Ziffern '0' bis '9' vorkommen,> dann genügt diese einfache 'Umrechnung'. Wenn da allgemeine Hex-Zahlen> ('0'-'9','A'-'F','a'-'f') vorkommen können, dann schreibst du dir am> besten eine Funktion, der du einen einzelnen char übergibst, und die den> numerischen Wert für diesen char liefert.
Ok, denke ich bekomme es jetzt hin. Das war das i-Tüpflchen.
Melde mich mit dem ganzen Ergebnis die nächste Zeit nochmal.
Danke&Gruss
erleichert schrieb:> uint8 hexString2int (unsigned char Str)> {>> switch (Str)> {> case '0' : return 0 ; break;> .> .> case '9' : return 9 ; break;> case 'a' : return 10 ; break;> case 'A' : return 10 ; break;> .> .> .> case 'F' : return 15 ; break;> default : return 0 ;> }
kürzer (und die Funktion richtig benannt. Die konvertiert keinen String
sondern ein einzelnes Zeichen!)
1
uint8hexDigit2int(charhexDigit)
2
{
3
if(isdigit(hexDigit))
4
returnhexDigit-'0';
5
6
if(hexDigit>='a'&&hexDigit<='f')
7
returnhexDigit-'a'+10;
8
9
if(hexDigit>='A'&&hexDigit<='F')
10
returnhexDigit-'A'+10;
11
12
return0;
13
}
Du musst unbedingt anfangen zwischen einem String (einer Sequenz von
Charactern) und einem einzelnen char auch sprachlich zu unterscheiden.
Du kommst sonst in Teufels Küche, wenn du das nicht tust.