C Code char Zahlenreihe zu Int Hexwerten

Gast #4142265
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!
#4142275
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.
Gast #4142280
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
  }
Gast #4142309
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
#4142315
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.
Gast #4142325
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.
#4142339
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'.
Gast #4142348
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!!!
Gast #4142359
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
Gast #4142391
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
Gast #4142749
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
}
#4142752
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren