C语言 二进制翻译


#include <stdio.h>
int main() {
  unsigned char data[1];
  FILE *f = fopen("bill.jpg", "rb");
  while (!feof(f)) {
    if (fread(data, 1, 1, f) > 0) {
      printf("0x%02xn", data[0]);
    }
  }
  fclose(f);
}

是这样吗?我很担心,因为如果我使用hexdump查看文件,我会得到完全不同的输出。

这将正确地以十六进制格式打印文件的第一个字节。

查看所使用的Hexdump实用程序的文档,或者告诉我们正在使用哪个平台。一些转储实用程序在每行上以相反的顺序显示字节,以便在您理解了它在做什么之后,使小端读取更直观。

我很抱歉,但是没有——while (!feof(f))基本上总是错误的——它通常会两次读取文件中的最后一项。这是我几年前写的一个相当实用的十六进制转储程序:

/* public domain by Jerry Coffin, tested with MS C 10.0 and BC 4.5
 */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
    unsigned long offset = 0;
    FILE *input;
    int bytes, i, j;
    unsigned char buffer[16];
    char outbuffer[60];
    if ( argc < 2 ) {
        fprintf(stderr, "nUsage: dump filename [filename...]");
        return EXIT_FAILURE;
    }
    for (j=1;j<argc; ++j) {
        if ( NULL ==(input=fopen(argv[j], "rb")))
            continue;
        printf("n%s:n", argv[j]);
        while (0 < (bytes=fread(buffer, 1, 16, input))) {
            sprintf(outbuffer, "%8.8lx: ", offset+=16);
            for (i=0;i<bytes;i++) {
                sprintf(outbuffer+10+3*i, "%2.2X ",buffer[i]);
                if (!isprint(buffer[i]))
                    buffer[i] = '.';
            }
            printf("%-60s %*.*sn", outbuffer, bytes, bytes, buffer);
        }
        fclose(input);
    }
    return 0;
}

相关内容

  • 没有找到相关文章