gpt4 book ai didi

在 C 中将二进制文件转换为文本文件

转载 作者:太空宇宙 更新时间:2023-11-04 03:31:58 25 4
gpt4 key购买 nike

我在尝试将二进制文件转换为文本文件时遇到问题。现在,我得到“hello 16”的输出。我应该得到 5 行输出,其中第一行应该是“hello 32”。我不确定我哪里出错了,但我已经花了几个小时试图弄明白了。 Link to Binary File

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 的字节顺序和大小符合您的预期。
    • 然后您打印字符串,假设文件中有一个 '\0',否则您将调用未定义的行为。

如果不看代码,很难说出哪里出了问题。

请注意,二进制文件应使用 "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);
}

关于在 C 中将二进制文件转换为文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35677906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com