Forum: PC-Programmierung C89 Substring in Hex suchen


von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Juten Nabend!

ich suche mir schon seit Tagen einen Wolf ...

Ich lese hier Hex ein ->

1
  unsigned char buffer[8096];
2
3
    while (1) {
4
5
    res = read(fd, buffer, sizeof(buffer)-1);
6
7
      if (res > 0) {
8
      buffer[res] = '\0';
9
              
10
        for (i=0; i<=res; ++i ) {
11
        printf("%x ", buffer[i]);
12
        }
13
14
      }
15
    
16
    }

Was soweit gut läuft (Start sequenze: 1b 1b 1b 1b 1 1 1 1) ->

1
1b 1b 1b 1b 1 1 1 1 0 76 5 3 f8 ce 90 62 0 0 62 
2
0 72 63 1 1 76 1 0 1 5 1 52 ef 86 9 8 0 5 35 34 
3
2d 4c 96 99 1 0 1 63 26 cf 0 76 5 3 0 f8 ce 91 
4
62 0 62 0 72 0 63 7  1 77 1 9 8 5 0 35 34 2d 4c 
5
96 99 7 1 0 0 62 a ff ff 72 62 1 0 65 1 f6 f3 17 
6
7b 77 7 0 81 81 c7 82 3 ff 1 1 0 1 1 4 49 53 4b 
7
1 77 0 7 1 0 0 0 9 ff 1 0 1 1 1 9 8 5 35

Was ich allerdings NICHT hinbekomme ist nach einem
Teilstück zu suchen :(

Das hier läuft leider nicht ->
Was mir fast klar ist, ich müsste irgend wie
nach [i]+1+2+3+4 suchen können?!

1
ptr = strstr( buffer[i], "\0x1b\0x1b\0x1b\0x1b" );


Ja, ich habe zuerst in meinen Büchern nachgelesen!

von Hmm (Gast)


Lesenswert?

Was heisst: "Es läuft nicht"? Das ist keine Fehlerbeschreibung.

Poste mal ein Minimalbeispiel, das compilierbar ist, nenne uns Compiler 
und System und poste auch eine Datendatei dazu.

Lies auch mal den Netiquette-Artikel hier im Forum, bitte.

von Fabian O. (xfr)


Lesenswert?

Henrik Wellschmidt schrieb:
> ptr = strstr( buffer[i], "\0x1b\0x1b\0x1b\0x1b" );

Das kann ja auch nicht funktionieren. Das erste Argument muss ein String 
sein und kein einzelnes Zeichen.

Vielleicht meinst Du das hier?
1
ptr = strstr( buffer + i, "\0x1b\0x1b\0x1b\0x1b" );

Macht allerdings in diesem Zusammehang nicht so viel Sinn. Du musst ja 
vermutlich nur einmal nach dem Teilstück suchen und nicht ab jedem 
Zeichen erneut. Höchstens ab der nächsten Fundstelle wieder ...

von Hmm (Gast)


Lesenswert?

Naja. Ob das wirklich der Code war? Da hätte er ja wegen dem Datentyp 
des ersten Parameters eine Warnung bekommen.

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Hmm schrieb:
> Was heisst: "Es läuft nicht"? Das ist keine Fehlerbeschreibung.
>
> Poste mal ein Minimalbeispiel, das compilierbar ist, nenne uns Compiler
> und System und poste auch eine Datendatei dazu.

Na klar ...

Code: http://pastebin.com/raw.php?i=0MkZXgzN

Daten: http://pastebin.com/raw.php?i=6Wizivpv

gcc version 4.6.3 (Debian 4.6.3-14+rpi1)

> Lies auch mal den Netiquette-Artikel hier im Forum, bitte.

Ich find die nicht! Nicht in der Hilfe, nicht in der Suche?!

von DirkB (Gast)


Lesenswert?

1. liest du kein Hex ein sondern binäre Daten.
2. kommt das Hex nur vom %x bei printf
3. hast du Null-Bytes in deinen Daten. Da kannst du mit den 
str-Funktionen nichts anfangen.
4. ist das <= in der for(i= Schleife verkehrt.

von Fabian O. (xfr)


Lesenswert?

Henrik Wellschmidt schrieb:
> Code: http://pastebin.com/raw.php?i=0MkZXgzN
>
> Daten: http://pastebin.com/raw.php?i=6Wizivpv
>
> gcc version 4.6.3 (Debian 4.6.3-14+rpi1)

Was soll denn da auch passieren? Nach dem Einlesen der Daten wird 
strstr() ab jedem Zeichen im String einmal aufgerufen und das Ergebnis 
weggeworfen. Bis auf den read()-Aufruf kann der Compiler im Prinzip 
alles wegoptimieren.

>
>> Lies auch mal den Netiquette-Artikel hier im Forum, bitte.
>
> Ich find die nicht! Nicht in der Hilfe, nicht in der Suche?!

http://www.mikrocontroller.net/articles/Netiquette

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

DirkB schrieb:
> 1. liest du kein Hex ein sondern binäre Daten.

???

Binary

A numbering system based on 2 in which 0 and 1 are the only available 
digits.



Hexa Decimal

A numbering system which uses a base of 16. The first ten digits are 0-9 
and the next six are A-F.

von DirkB (Gast)


Lesenswert?

read liest die Daten so ein, wie sie im Stream stehen.
Da wird nichts interpretiert.

Hex-, Dezimal- oder Dual-Darstellung ist für den Menschen.
Der Computer braucht das nicht.

Und wenn du
1
 printf("%u ", buffer[i]);
 machst, kommen Dezimalzahlen raus, aber an den Daten ändert sich 
nichts.

Ob da jetzt 0x1b  oder 033 oder 27 steht, ist egal, denn es ist immer 
das gleiche Bitmuster im Computer. Dargestellt wäre das  0b00011011

von Hmm (Gast)


Lesenswert?

"Netiquette" mit u war natürlich falsch. Sorry.

Zu dem letzten Beitrag möchte ich noch hierauf verweisen: 
Beitrag "Re: string oder int an Display ausgeben"

Ich glaube ich mache mal einen Artikel daraus.

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.