读取字符串中的二进制文件显示奇怪的输出
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�
有谁知道我的错误是什么?
如果您的文件包含非 ASCII 字符,结果将看起来像垃圾。
如果读取失败,则缓冲区将未初始化,结果看起来像垃圾。
如果没有 "NULL" 终止符,那么您的部分或全部输出将看起来像垃圾。
即使缓冲区打印垃圾 - 并且有 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]);
}
所以,这是我的场景:
我有一个二进制文件,我得到的信息是:文件大小为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�
有谁知道我的错误是什么?
如果您的文件包含非 ASCII 字符,结果将看起来像垃圾。
如果读取失败,则缓冲区将未初始化,结果看起来像垃圾。
如果没有 "NULL" 终止符,那么您的部分或全部输出将看起来像垃圾。
即使缓冲区打印垃圾 - 并且有 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]);
}