Format Umwandlung

Hi,
ich lese aus einer Datei einen String aus. bei dem Inhalt handelt es sich um HexZeichen. Da es aber scheinbar (oder nur mir) nicht möglich ist es mit fscanf(fp,"%x",&ein[x]), zu machen habe ich es mit ch = fgetc (fp)
whiel (!feof(fp))
{putchar (ch);
ch = fgetc (fp);}
gemacht. jetzt kann ich auch schon aus der ausgabe sehen das die Zeichen alle gelesen werden.( halt int)
da ich die nun ja in Hex haben will hab ich jedes ch in einen Vector geschrieben und so dauerhaft gespeichert.
Nun wollte ich es einfach mit printf umwandeln aber es wird nur jedes Zeichen einzeln umgewandelt und nicht die 2 die zusammen gehören.

Hat jemand eine Idee wie ich das Problem lösen oder ggf umgehen kann?

Gruß

Hi

ich [mache dies und das]

Hat jemand eine Idee wie ich das Problem lösen oder ggf
umgehen kann?

Erst müsste man feststellen, ob es ein Problem ist.

Du hast vergessen, ein konkretes Beispiel
für die fragliche Datei mitzuliefern,
an der Du scheiterst.

Bitte auch für die Programmlistings

**pre** \>
 Programm
 Listing
 sieht
 schöner
 aus
**/**** pre**\>

verwenden :wink:

Grüße

CMБ

Hi Semjon,
danke für die schnelle Antwort
Hier mein Code:
die Datei /var/Werte.txt enthält :262303dad0 und das wird mir auch angezeigt. Lass ich nun aber in Hex ausgeben wird 32 36 usw angezeigt was eben 2 und 6 entspricht und nicht & was 26 entspricht.

#include 
#include 

FILE \*fp;

unsigned char transfer[25]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
int d =0;
int ch;

int main (void)
{
 fp = fopen ("/var/Werte.txt","r"); 
 // DAteiexistenz prüfen 
 if (fp != NULL)
 {printf ("\n Datei wurde geoeffnet\n");} 
 {
 //for (d=0;d

Vielleicht hat du oder jemand anders ja die zündende Idee

Gruß
jan

Hi Jan,

die Datei /var/Werte.txt enthält :262303dad0 und das wird mir
auch angezeigt. Lass ich nun aber in Hex ausgeben wird 32 36
usw angezeigt was eben 2 und 6 entspricht und nicht & was 26
entspricht.

OK. Ich sehe das Problem, glaube ich.

Du musst immer zwei Zeichen
zusammen betrachten, dann kommt auch
das raus, was Du möchtest,z.B.: 26 23 03 da d0

 1. 26 =\> & (ASCII), 38 (dezimal), 26 (hex)
 2. 23 =\> # (ASCII), 35 (dezimal), 23 (hex)
 3. 03 =\> ♥ (ASCII), 3 (dezimal), 3 (hex)
 4. da =\> ┌ (ASCII), 218 (dezimal), da (hex)
 5. d0 =\> ð (ASCII), 208 (dezimal), d0 (hex)

Ich hab mal Deinen Quelltext geringfügig modifiziert,
arbeite Dich mal durch und schau mal, ob Du das
hinbekommst.

Grüße

CMБ

#include 
#include 
#include 

 unsigned char transfer[25][3]; // immer zwei zeichen lesen, 3'tes ist '\0'

 int main ()
{
 int i, n, zahl, d=0;
 FILE \*fp = fopen( "werte.txt", "rt" ); 

 if( fp != NULL ) { // pruefen ob oeffnen geklappt hat
 printf ("\nDatei wurde geoeffnet\nLese ein: "); 
 n = sizeof(transfer[0]) - 1; // n=2: also immer 2 zeichen lesen

 while ( fread(transfer[d], n, 1, fp) == 1 ) {
 printf( "%c%c ",
 transfer[d][0],
 transfer[d][1] );
 d++;
 }
 printf ("\n%d Bloecke a %d Zeichen eingelesen.\n", d, n); 
 fclose( fp );
 }

 // in transfer[i] stehen zwei zeichen in hex-repräsentation,
 // machen wir 'binäre' werte (und anderes) daraus 

 for(i=0; i %c (ASCII), %4d (dezimal), %4x (hex) \n", 
 i+1,
 transfer[i][0],transfer[i][1], // gelesene zeichen
 zahl,
 zahl, 
 zahl );

 } 

 return 0;
}

Danke schön, so klappt es wunderbar.
Ist aber doch etwas kompliziert

Gruß
jan

Hallo Jan,

Danke schön, so klappt es wunderbar.
Ist aber doch etwas kompliziert

Wenn man es etwas umschreibt, wird
es einfacher:

#include 
#include 
#include 

 int main ()
{
 FILE \*fp;
 int hexpos=0, nzahl=0;
 unsigned hexzahl[80];
 char hextext[80], hexpuffer[3];
 char fname[] = "werte.txt";
 
 
 if( (fp = fopen( fname, "rt" )) == 0 ) {
 perror( fname );
 return 1;
 }

 if( fgets(hextext, sizeof(hextext), fp) != 0 ) {
 while( strlen( &hextext[hexpos] ) \> 1 ) {
 hexpuffer[0] = hextext[hexpos];
 hexpuffer[1] = hextext[hexpos+1];
 hexpuffer[2] = '\0';

 sscanf(hexpuffer, "%X", &hexzahl[nzahl]);
 printf("Hex-Zeichen/Zahl: %c \t ==\> 0x%X \n", hexzahl[nzahl], hexzahl[nzahl]);

 nzahl += 1;
 hexpos += 2;
 }
 }
 
 fclose(fp);
 return 0;
}

Grüße

CMb