fgetc在读取文件时遗漏字节

时间:2016-10-20 22:52:41

标签: c fgetc

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

1 个答案:

答案 0 :(得分:2)

以二进制模式打开文件。

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

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

第二期:fgetc()返回intunsigned char范围内的EOF。使用类型intEOF与所有数据输入区分开来。

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

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