Was könnte an diesem Programm falsch sein?
Es soll einfach eine Datei (oder von stdin) lesen, und alles als Hex-Werte ausgeben. Mit kleinen Dateien oder Strings funktioniert das auch wie es soll (also wenn man z.B. echo ABC | binToHex - ausführt, ist die Ausgabe 41 42 43) aber wenn man es mit größeren Dateien (~40 kB) versucht, werden nur die ersten 6 kB ausgegeben.
Ist an dem Code irgendwas falsches oder gibt es da ein Limit von der Windows-Seite? Oder ein Limit von der read() Funktion, dass ich irgendwie überlesen habe?
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main (int argc, char** argv)
{
char ch;
if (!strcmp(argv[argc - 1], "-")) {
while (scanf("%c", &ch) != EOF) printf("%02X ", ch & 0xFF);
}
else {
int f = open(argv[argc - 1], O_RDONLY);
if (f == -1) {
return 1;
}
while (read(f, &ch, 1) > 0) printf("%02X ", ch & 0xFF);
close(f);
}
return 0;
}
2 Antworten
Es ist kein Fehler, wenn read() 0 zurückgibt: Wenn das Betriebssystem noch dabei ist, den nächsten Sektor von der Platte zu holen, wartet read() nicht darauf.
Du musst das Dateiende explizit prüfen. Mit fopen() und fread() sollte es leichter gehen, und Du brauchst den Fall stdin nicht extra programmieren.
Danke damit hat es funktioniert! Und sieht auch noch wesentlich kürzer/einfacher/verständlicher aus:
#include <stdio.h>
int main (int argc, char** argv)
{
FILE* f = argc > 1 ? fopen(argv[argc - 1], "rb") : NULL;
if (f == NULL) f = stdin;
char ch;
while (fread(&ch, 1, 1, f)) printf("%02X ", ch & 0xFF);
fclose(f);
return 0;
}
HAllo,
Sehe ich das richtig oder überliest du Character die hex Null sind und gibst nichts aus?
Bei vielen Nullwerten kommst du dann ja lange nicht an die ANzahl vorhandener Zeichen heran bei der AUsgabe.
LG
Harry
Die read() Funktion gibt doch an, wie viele Zeichen gelesen wurden, dachte ich. Müsste doch dann auch bei 0x00 eine 1 zurück geben (weil ich immer ein Byte lesen will)