Inhalt einer Datei anzeigen / Dump Programm
-
Also ich hab nen Programm geschrieben was von der Betriebssystem Ebene aufgerufen werden soll mit den Parametern <option>( hexadez, dezimal oder octal auslesen) <datei> (datei die vom Programm ausgelesen werden soll).
Gebe ich dem Programm eine Textdatei mit zb dem Inhalt:
"1234567890ABCDEF"
dann macht er daraus (Leerzeichen zur Übersicht eingefügt):
octal:
61 62 63 64 65 66 67 70 71 60 101 102 103 104 105 106
dezimal:
49 50 51 52 53 54 55 56 57 48 65 66 67 68 69 70
hexadez:
31 32 33 34 35 36 37 38 39 30 41 42 43 44 45 46was ich mit der ASCI Tabelle noch nachvollziehen kann.
Wenn ich jetzt aber zb nen Pdf auslesen will bekomm ich da irgendwelche Salat wie zb FFFFFFFF , aber wenn ich binär auslese dürfte doch normal immer nur ein zeichen gelesen werden und wie kann das dann so groß werden?
Hier mal mein Programm:
#include <stdlib.h> #include <stdio.h> #include <string.h> void main(int argc, char *argv[]) { FILE *datei; int n; char option[1],dateiname[40]; char zeichen; if(argc==3) // Programm mit Parametern aufgerufen { strcpy(option,argv[1]); strcpy(dateiname,argv[2]); if( (datei=fopen(dateiname, "rb")) != NULL) { do { for(n=0; n<16; n++) // Zeilenlänge { fread(&zeichen, sizeof(char),1,datei); if(!feof(datei)) // Solange "end of file" nicht erreicht { if(option[0] == '-') { switch (option[1]) // h , o , d ? { case 'h': printf("%x",zeichen); printf(" ",zeichen); break; case 'o': printf("%o",zeichen); printf(" ",zeichen); break; case 'd': printf("%d",zeichen); printf(" ",zeichen); break; } } } } printf("\n"); //Zeilenende }while(!feof(datei)); // Solange "end of file" nicht erreicht } else { printf("Zu oeffnende Datei existiert nicht!\n"); } } else { printf("Parameteranzahl inkorrekt!\n"); } }
-
FFFFFFFF
[signed] char wird automatisch zu [signed] long erweitert. signed bedeutet, das Vorzeichen (= Bit Nummer 7) wird bei [signed] long das Bit Nummer 31.
HEX char 0x80 -> long 0xFFFFFF80 beides hat den dezimalen (vorzeichenbehafteten) Wert von -128
Lösung: printf("%x", zeichen&0xFF);
-
also müsste das ein unsigned char sein? bzw gibts sowas überhaupt?
-
habs grad ausprobiert unsigned char geht auch ohne zeichen&0xFF
Alle Ganzzahltypen gibt es in einer signed und in einer unsigned-Variante, wobei man das unsigned immer angeben muß. char 8Bit, short 16Bit, int 16/32Bit und long 32Bit
void main(
Habs grad noch gesehen ieeeeehhhhhh Maaaaammaaaaa!!!!!
-
ja ich weis ich müll mein speicher mit void zu , wird natürlich noch geändert
-
nur irgendwie ist mir die erklärung warum as unsignend werden muß noch nicht ganz klar.
gut möglich das ich jemandem erklären muß warum da nen unsigned steht.
-
Dragonslayer schrieb:
ja ich weis ich müll mein speicher mit void zu....
der gehört eindeutig auf diese liste: http://www.daujones.com/dausprueche.php
-
Dragonslayer schrieb:
nur irgendwie ist mir die erklärung warum as unsignend werden muß noch nicht ganz klar.
gut möglich das ich jemandem erklären muß warum da nen unsigned steht.Das muss kein unsigned werden... maskier die Ausagbe einfach mit &0xFF und gut ist
-
codefrag schrieb:
Das muss kein unsigned werden... maskier die Ausagbe einfach mit &0xFF und gut ist
doch, musses.
maskieren mit 0xff hilft nix, weil das höchste bit (vorzeichenbit) erhalten bleibt.
-
Kann mir nochmal jemand erklären warum?
Ist mir jetzt irgendwie net so ganz klar geworden.Bei welche Sachen schlägt es +berhaupt fehl wenn ich kein unsigned mache?
-
Dragonslayer_ schrieb:
Bei welche Sachen schlägt es +berhaupt fehl wenn ich kein unsigned mache?
ein char hat (normalerweise) 8 bits, also könnte man alle zahlen zwischen 0 und 255 (einschliesslich) rein packen.
der haken aber ist, dass der halbe wertebereich für negative zahlen reserviert ist, alles mit einem gesetzten bit7 ist negativ.
wenn du machst:char c = 127 + 1;
dann hast du schon einen überlauf. das ergebnis ist nicht 128 sondern wird -128.
mit 'unsigned char' klappt es aber.
-
Als Ergänzung hilft dir vielleicht folgende Tabelle:
http://www.cplusplus.com/doc/tutorial/variables.htmlZu diesen Wertebereich (von signed char) passt dann auch die ASCII Tabelle(0-127!):
http://www.torsten-horn.de/techdocs/ascii.htmIch denke mal (stark), daß das Problem bei Sonderzeichen im PDF auftreten wird, da diese Werte > 127 haben... und wenn du nur ein char (=signed char) hast, dann passen die Sonderzeichen als Integer-Wert eben nicht mehr rein. (char Zeichen werden intern als Integerwerte dargestellt)
Siehe z.B. eine Umlautetabelle hier:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39326.htmlUnd das mit dem Vorzeichenbit, hatte ich leider in meinen vorherigen Post vergessen. Also musst du mit unsigned deklarieren
-
Gut das hab ich verstanden,
bei welchen Anwendungen sind signed Chars dann überhaupt sinnvoll?weil ich mein es gibt ja keine negativen Sachen in der ASCI tabelle.
-
Dragonslayer schrieb:
Gut das hab ich verstanden,
bei welchen Anwendungen sind signed Chars dann überhaupt sinnvoll?naja, immer dann, wenn negative werte auftauchen können (und dürfen).
insbesondere, wenn sich durch die verwendung von unsigned typen fehler einschleichen können.