fgetc 在读取文件时丢失字节

fgetc misses bytes while reading a file

我用函数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;
}

以二进制模式打开文件。

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

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


第 2 期:fgetc() returns intunsigned charEOF 范围内。使用类型int区分EOF和所有数据输入。

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

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