将二进制文件转换为C中的文本文件
我在尝试将二进制文件转换为文本文件时出现问题。现在,我得到了“你好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);
}
您的二进制文件格式似乎尴尬:
- 您打开
"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);
}
[链接] https://gyazo.com/7252ca6fa6f36a1f430c93839cdd9110 编辑:这是一个图片的二进制文件我无法粘贴它到代码块 –
@AlexPurpleHosein:发布产生二进制文件的代码会更有用。规范似乎不正确。 – chqrlie
这是给定的输入和输出文件,我需要匹配没有产生它的当前代码[链接] https://gyazo.com/6837218c5e35909b9ce69f0f25cbbc2b –
硬不格式的细节来回答二进制文件 – user3528438
刚更新说明链接到二进制文件 –