2016-05-05 11 views
0

Ich arbeite in PPM-Format magische Zahl P3 http://netpbm.sourceforge.net/doc/ppm.htmlC if-Anweisung neue Linie

Ich habe eine wirklich lange unsigned char zu erkennen, in Ermangelung eines solchen Fall von Zeichen Leerzeichen und Zeilenumbrüchen ist. Wenn ich es ausdrucken druckt es schön, wie dies zum Beispiel ...

01 30 03 19 02 39 01 91 39 81 45 92 40 29 10 93 
02 91 29 04 19 02 19 04 19 03 94 10 92 03 01 19 02 
10 02 93 04 

etc .. Sie sehen, dass einige Linien sind länger als andere. Diese riesige Zeichenfolge wurde aus einer Datei eingelesen und in ein unsigniertes Zeichen * eingefügt. Mein Problem ist, wenn ich die Werte zu ändern, sagt jeden 2. char ändern, wie ...

01 becomes 00 //changing the LSB 
30 becomes 31 

ich in ein Problem laufen, wenn dies zu tun. Das Problem tritt auf, wenn ich das Ende der Linie erreiche. Meine if-Anweisung erkennt das Ende der Zeile Token nicht, und wenn es den nächsten Wert ergreift, ergreift es nicht die zweite Zahl, sondern greift die erste.

Meine if-Anweisung das Ende der Zeile zu erfassen nicht funktioniert ...

if(num[count] == '\n' || num[count] == '\0' || num[count] == '\r' || num[count]== '\t') 
{ 
    count = count + 2; 
} 

Das Ziel dieser if-Anweisung ist die neue Linie und Fortschritt Zahl von 2, so dass der nächste Wert I Geige zu erkennen Mit wäre die 2 von 02 auf der nächsten Linie. Ich bin mir nicht ganz sicher, warum ich das Ende der Zeile Token nicht erkennen kann, denn sicherlich ist etwas da, wenn ich das unsigned char * drucke, in der obigen Weise mit neuen Zeilen druckt.

+0

Ihre Zeilenumbrüche verwenden 2 Byte. –

+0

also sollte ich "\" erkennen? – user3622460

+0

Nein, Sie müssen einen LF direkt nach einem CR erkennen. –

Antwort

0

Wenn Ihre Variable num den Typ unsigned char * hat, entspricht jedes Inkrement um eins in Ihrer count-Variablen einem Inkrement um ein Oktett (d. H. Ein Byte). Ein Oktett entspricht zwei hexadezimalen Werten. Daher steht die 01, die Sie am Anfang Ihrer Eingabe haben, für ein Oktett. Die 0 repräsentiert die vier höchstwertigen Bits, und die 1 repräsentiert die vier niedrigstwertigen Bits.

Wenn Sie also die Zählung um zwei erhöhen, was ich davon ausgehe, dass Sie auch außerhalb dieser if-Anweisung arbeiten, überspringen Sie eigentlich alle anderen Zeichen.

Wie oben erklärt, ist die falsche Vorstellung, dass jeder der hexadezimalen Werte, die Sie ausgedruckt sehen, nicht einem Byte, sondern 4 Bits innerhalb eines Bytes entspricht. Sie beschreiben den Prozess, den Sie durchführen möchten, als "LSB ändern". Aber das Beispiel, das Sie gaben, ändert tatsächlich die am wenigsten signifikanten vier Bits, nicht das niedrigstwertige Byte.