【问题标题】:fgetc misses bytes while reading a filefgetc 在读取文件时丢失字节
【发布时间】:2016-10-20 22:52:41
【问题描述】:

我使用函数fgetc读取文件的每个字节,然后用printf写入。

我刚刚注意到,当我将结果与十六进制编辑器进行比较时,fgetc 有时会丢失一些字节。

例如,第一个错误从第 118 个字节开始,其他很多错误都是随机的……

有人经历过吗?

这是代码(Windows)

char main(int argc, char* argv[]) {
    FILE* fdIn;
    FILE* fdOut;
    long size = 0;
    long i = 0;
    char c = 0;
    if (argc == 3) {
        if ((fdIn = fopen(argv[1], "rt")) == NULL) {
            printf("FAIL\n");
            return 0;
        }
        if ((fdOut = fopen(argv[2], "w+")) == NULL) {
            printf("FAIL\n");
            return 0;
        }
        fseek(fdIn, 0L, SEEK_END);
        size = ftell(fdIn);
        fseek(fdIn, 0L, 0);
        fprintf(fdOut, "unsigned char shellcode[%ld] = {", size);
        while (i < size) {
            c = fgetc(fdIn);
            if (!(i % 16))
                fprintf(fdOut, "\n\t");
            fprintf(fdOut, "0x%02X", (unsigned char)c);
            if (i != size - 1)
                fprintf(fdOut, ", ");
            i++;
        }
        fprintf(fdOut, "\n};\n");
        fclose(fdIn);
        fclose(fdOut);
        printf("SUCCESS");
        system("PAUSE");
    }
    return 0;
}

【问题讨论】:

  • 以二进制模式打开文件。
  • 向我们展示您的代码、您的测试数据、预期结果和实际结果。
  • 您在使用 Windows 吗?缺少的字符是 CR(\r\012)吗?或者 ^Z (\032)?你是用文本模式还是二进制模式打开文件?
  • 问你可能不公平,Adam(所以这实际上是针对整个世界的),但我想知道:为什么人们坚持使用 fgetc() 而不是getc()?对于新手问题,这里有一种强烈的趋势,即使用fgetc() 进行单字符输出并使用printf() 进行所有输出,即使putchar() 会出色地完成这项工作。嗯,这可能是不可思议的——但这对我来说很奇怪。
  • 你可以输出unsigned char shellcode[] = {;这样你就不再需要size了。

标签: c fgetc


【解决方案1】:

以二进制模式打开文件。

// if ((fdIn = fopen((char*)argv[1], "rt")) == NULL) { 
//                                 >.< 
if ((fdIn = fopen((char*)argv[1], "rb")) == NULL) {

在文本模式下,并且可能是基于 Windows 的机器,给定 "rt"'\r''\n' 对肯定会转换为 '\n'。 IAC,OP 的十六进制转储目标不需要翻译。


第二期:fgetc() 返回int,范围为unsigned charEOF。使用类型intEOF 与所有数据输入区分开来。

// char c = 0;
int c = 0;
...
c = fgetc(fdIn);

// also add
if (c == EOF) break;

【讨论】:

  • 注意:输出文件应保持以文本模式打开,因为代码使用fprintf(fdOut, "0x%02X" 打印文本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多