c++ - 如何将文件内容识别为 ASCII 或二进制

标签 c++ ascii binaryfiles file-format

如何使用 C++ 识别文件内容是 ASCII 还是二进制?

最佳答案

如果文件只包含十进制字节 9–13、32–126,则它可能是纯 ASCII 文本文件。否则,它不是。但是,它可能仍然是另一种编码的文本。

如果在除了上述字节之外,该文件包含十进制字节 128–255,它可能是一个 8 位或变量的文本文件 -长度 基于 ASCII 的编码,例如 ISO-8859-1、UTF-8 或 ASCII+Big5。如果不是,出于某些目的,您可能可以在这里停下来并认为该文件是二进制文件。但是,它可能仍然是 16 位或 32 位编码的文本。

如果文件不符合上述限制,请检查文件的前 2-4 个字节是否有 byte-order mark :

  • 如果前两个字节是十六进制FE FF,则文件暂时是UTF-16 BE。
  • 如果前两个字节是十六进制FF FE,后面两个字节是not十六进制00 00,则文件为暂定 UTF-16 LE。
  • 如果前四个字节是十六进制00 00 FE FF,则文件暂定为UTF-32 BE。
  • 如果前四个字节是十六进制FF FE 00 00,则文件暂时是UTF-32 LE。

如果通过上述检查,您已经确定了一个暂定编码,那么只检查下面对应的编码,以确保该文件不是恰好匹配字节顺序标记的二进制文件。

如果您尚未确定暂定编码,则该文件可能仍然是其中一种编码的文本文件,因为字节顺序标记不是强制性的,因此请检查以下列表中的所有编码:

  • 如果文件包含十进制值为 9-13、32-126 和 128 或以上的大端双字节字,则该文件可能是 UTF-16 BE。<
  • 如果文件包含十进制值为 9-13、32-126 和 128 或以上的 little-endian 两字节字,则该文件可能是 UTF-16 LE。<
  • 如果文件包含十进制值为 9–13、32–126 和 128 或以上的大端四字节字,则该文件可能是 UTF-32 BE。<
  • 如果文件包含十进制值为 9-13、32-126 和 128 或以上的小端四字节字,则该文件可能是 UTF-32 LE。<

如果在所有这些检查之后,您仍未确定编码,则该文件不是我所知道的任何基于 ASCII 编码的文本文件,因此对于大多数目的,您可能会认为它是二进制文件(它可能仍然是非 ASCII 编码(例如 EBCDIC)的文本文件,但我怀疑这超出了您的关注范围)。

关于c++ - 如何将文件内容识别为 ASCII 或二进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/277521/

相关文章:

C++指针值改变

c++ - 如何在 gdb 中保存设置?

scala - 在 Scala 中检查字符是否为 ASCII 字母 (a-Z) 的优雅方法是什么?

python - 尝试打印人类可读的 ascii 字符串

io - 将数字以二进制格式写入lua文件中

php - PHP中\x00,\x04是什么意思

C++通过Windows搜索路径查找可执行文件

solr - 使用 Solr 处理变音符号和重音符号

c# - C# 中二进制文件的读写

c++ - QToolBox - 展开多个项目