Forum: Mikrocontroller und Digitale Elektronik C Code char Zahlenreihe zu Int Hexwerten


von verzweifelt (Gast)


Lesenswert?

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:
1
int i=0,ih=0;
2
3
for (i=0; i<16;i++){
4
printf(bufferhexwert[i],"0x%i%i",zahlen[ih],zahlen[ih+1]);
5
ih+=2;
6
}

Gruss+Dank!

von Daniel S. (daniel_s49)


Lesenswert?

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 ;-)

von Karl H. (kbuchegg)


Lesenswert?

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
1
  for( i = 0; i<32; i += 2 )
2
  {
3
    bufferhexwert[i/2] = ( zahlen[i] - '0' ) * 16 + ( zahlen[i+1] - '0' );
4
  }

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.

von holger (Gast)


Lesenswert?

>Schon. Aber auf einer ganz anderen Ebene als du vermutest

Du hast übersehen das er ASCII Zeichen benutzt.
1
  for( i = 0; i<32; i += 2 )
2
  {
3
    bufferhexwert[i/2] = (zahlen[i] - '0') * 16 + zahlen[i+1]- '0';
4
  }

von Karl H. (kbuchegg)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

>>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;)

von verzweifelt (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
  char c = 65;
2
  char c = 0x41;
3
  char c = '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.

von verzweifelt (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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'.

von verzweifelt (Gast)


Lesenswert?

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!!!

von verzweifelt (Gast)


Lesenswert?

holger schrieb:
>>Schon. Aber auf einer ganz anderen Ebene als du vermutest
>
> Du hast übersehen das er ASCII Zeichen benutzt.
>
>
1
>   for( i = 0; i<32; i += 2 )
2
>   {
3
>     bufferhexwert[i/2] = (zahlen[i] - '0') * 16 + zahlen[i+1]- '0';
4
>   }
5
>

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

von verzweifelt (Gast)


Lesenswert?

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

von erleichert (Gast)


Lesenswert?

Besten Dank Karl Heinz und holger!

Rennt jetzt wie Harry Hirsch

Kurzfassung:
1
..
2
uint8 hexString2int (unsigned char Str);
3
..
4
5
uint8 hexString2int (unsigned char Str)
6
{
7
8
switch (Str)
9
{
10
  case '0'  : return 0  ; break;
11
  .
12
  .
13
  case '9'  : return 9  ; break;
14
  case 'a'  : return 10 ; break;
15
  case 'A'  : return 10 ; break;
16
  .
17
  .
18
  .
19
  case 'F'  : return 15 ; break;
20
  default   : return 0  ;
21
}
22
23
}
24
 
25
26
for( i = 0; i<32; i += 2 )
27
{
28
bufferhexwert[i/2] = hexString2int((zahlen[i] ) * 16 + hexString2int(zahlen[i+1]) ;
29
}

von Karl H. (kbuchegg)


Lesenswert?

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
uint8 hexDigit2int( char hexDigit )
2
{
3
  if( isdigit( hexDigit) )
4
    return hexDigit - '0';
5
6
  if( hexDigit >= 'a' && hexDigit <= 'f' )
7
    return hexDigit - 'a' + 10;
8
9
  if( hexDigit >= 'A' && hexDigit <= 'F' )
10
    return hexDigit - 'A' + 10;
11
12
  return 0;
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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.