2016-02-28 1162 views
1

我在尝试将二进制文件转换为文本文件时出现问题。现在,我得到了“你好16”的输出。我应该得到5行输出,其中第一行应该是“你好32”。我不确定我哪里出了问题,但我一直试图找出几个小时。 Link to Binary File将二进制文件转换为C中的文本文件

void BinaryToText(char *inputFile, char *outputFile) { 
    unsigned char str[256]; 
    unsigned int num; 
    int fileLen; 

    FILE *finp; 
    FILE *fout; 

    finp = fopen(inputFile, "r"); 
    fout = fopen(outputFile, "w"); 

    fseek(finp, 0, SEEK_END); 
    fileLen = ftell(finp); 
    fseek(finp, 0, SEEK_SET); 

    while (fread(&fileLen, sizeof(char), 1, finp) == 1) { 
     fread(&str, sizeof(str), 1, finp); 
     fread(&num, sizeof(int), 1, finp); 
     fprintf(fout, "%s %d\n", str, num); 
    } 
    fclose(finp); 
    fclose(fout); 
} 
+0

硬不格式的细节来回答二进制文件 – user3528438

+0

刚更新说明链接到二进制文件 –

回答

1

您的二进制文件格式似乎尴尬:

  • 您打开"r"输入文件:应该以二进制模式"rb"打开。
  • 您首先尝试使用ftell()确定文件大小。请注意,这不适用于管道和设备。在你的情况下,无论如何你都不会使用fileLen
  • 在循环:
    • 你看,你在fileLen一部分存储单个字节。
    • 然后您读取一个256字节的字符串。
    • 您直接读取一个数字,假定您所期望的字节顺序和大小为int
    • 然后你打印字符串,假设文件中有,否则你会调用未定义的行为。

这是很难说什么是错的没有看到写代码。

请注意,二进制文件应该打开"rb"以防止在某些平台(特别是Windows)上进行换行序列的虚假转换。

编辑:

形式在评论中提供的额外信息,这里是一个修改后的版本应该分析你的二进制文件更为恰当:

void BinaryToText(char *inputFile, char *outputFile) { 
    unsigned char str[256]; 
    unsigned int num; // assuming 32 bit ints 
    int i, len; 

    FILE *finp = fopen(inputFile, "rb"); 
    FILE *fout = fopen(outputFile, "w"); 

    while ((len = fgetc(finp)) != EOF) { 
     fread(str, len, 1, finp); 
     str[len] = '\0'; 
     num = (unsigned int)fgetc(finp) << 24; 
     num |= fgetc(finp) << 16; 
     num |= fgetc(finp) << 8; 
     num |= fgetc(finp); 
     fprintf(fout, "%s %d\n", (char*)str, num); 
    } 
    fclose(finp); 
    fclose(fout); 
} 
+0

[链接] https://gyazo.com/7252ca6fa6f36a1f430c93839cdd9110 编辑:这是一个图片的二进制文件我无法粘贴它到代码块 –

+0

@AlexPurpleHosein:发布产生二进制文件的代码会更有用。规范似乎不正确。 – chqrlie

+0

这是给定的输入和输出文件,我需要匹配没有产生它的当前代码[链接] https://gyazo.com/6837218c5e35909b9ce69f0f25cbbc2b –

相关问题