读取字符串中的二进制文件显示奇怪的输出

Reading binary file in string shows strange output

所以,这是我的场景:

我有一个二进制文件,我得到的信息是:文件大小为1kb,文件中只有字符,文件是二进制文件。

所以,我尝试读取并打印前 128 个字符来测试这样做:

FILE *f;
if((f = fopen(argv[1],"rb")) == NULL){ 
    printf("CANNOT OPEN FILE\n");
    exit(1);
}

char buffer[128];
printf("%d\n",fread(buffer, sizeof(char), 128, f));
printf("%s", buffer);

但是输出看起来根本不是 128 大小的字符串,输出是这样的: �1X�Z%]X�^���ƛ�T�tA!=�p�>�A��g>~���k�*��;�2�

有谁知道我的错误是什么?

  1. 如果您的文件包含非 ASCII 字符,结果将看起来像垃圾。

  2. 如果读取失败,则缓冲区将未初始化,结果看起来像垃圾。

  3. 如果没有 "NULL" 终止符,那么您的部分或全部输出将看起来像垃圾。

  4. 即使缓冲区打印垃圾 - 并且有 NULL 字符 - 输出将以 '\0' 结束。

建议:

在记事本中查看文件。或者,更好的是,在十六进制编辑器中查看它。

Linux 有一个 "strings" 命令,它只打印二进制文件中的文本字符串。您可以在此处下载 "strings" 的 Windows 版本:

https://technet.microsoft.com/en-us/sysinternals/strings.aspx

将数据读入缓冲区后,尝试打印字符的ASCII码。这将指示字符是否可打印。

char buffer[128];
int n = fread(buffer, sizeof(char), 128, f);
for (int i = 0; i < n; ++i)
{
   printf("i: %d, ASCII code: %d\n", i, buffer[i]);
}