繁体   English   中英

如何在 C 中检查文件是文本(ASCII)还是二进制文件

[英]How can I check if file is text (ASCII) or binary in C

我需要编写 C 代码来检查文件是文本(ASCII)还是二进制

有人可以帮忙吗? 谢谢

典型的方法是读取前几百个字节并查找 ASCII NUL。

如果文件包含NUL,则肯定是二进制文件。 大多数二进制文件确实包含 NUL 字节,但文本文件不应包含 NUL 字节。

#include <string.h>
bool is_binary(const void *data, size_t len)
{
    return memchr(data, '\0', len) != NULL;
}

请注意,这是一种启发式方法。 换句话说,它有时会出错。

读取所有字符并查看它们是否都是 ASCII,即从 0 到 127(包括 0 到 127)的代码。

一些工具仅通过检查文件是否包含任何代码为 0 的字节来确定文件是文本文件还是二进制文件。

显然,如果同时应用这两种方法,对于某些文件,您将获得不同的结果,因此,您必须准确定义您要查找的内容。

您可以使用 libmagic。 下面的代码将大致向您展示“file”命令的执行方式。 (下面的代码又快又脏——它可能需要清理。)

#include <string.h>
#include <magic.h>
#include <stdio.h>


//------------------------------------------------------------------------------
struct magic_set * prep_magic(int flags)
{
struct magic_set *magic = magic_open(flags);
const char *errstring;
int action = 0;
const char *magicfile = NULL;

if (magicfile == NULL)
    magicfile = magic_getpath(magicfile, action);

if (magic == NULL)
    {
        printf("Can't create magic");
        return NULL;
    }
if (magic_load(magic, magicfile) == -1)
    {
        printf("%s", magic_error(magic));
        magic_close(magic);
        return NULL;
    }
if ((errstring = magic_error(magic)) != NULL)
        printf("%s\n", errstring);

return magic;
/* END FUNCTION prep_magic */ }
//------------------------------------------------------------------------------
int main(int argc, char **argv)
{
int flags = 0;
struct magic_set *msetptr = NULL;

const char *testfile = (char *)"/etc/motd";


msetptr = prep_magic(flags);
if( msetptr == NULL )
    printf("no mset ptr\n");

const char *typer;
typer = magic_file( msetptr, testfile );
printf("typer = %s\n", typer );

return 0;
/* END PROGRAM */ }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM