|
|
1
21
我可能会寻找大量的控制字符,这些字符通常出现在二进制文件中,但很少出现在文本文件中。二进制文件往往使用0,因此只测试多个0字节就足以捕获大多数文件。如果您关心本地化,那么也需要测试多字节模式。 不过,如前所述,您可能总是不走运,并得到一个看起来像文本的二进制文件,反之亦然。 |
|
2
31
有一种方法叫做马尔可夫链。扫描两种类型的几个模型文件,并针对从0到255的每个字节值收集后续值的统计信息(基本上是概率)。这将为您提供一个64kb(256x256)的配置文件,您可以将运行时文件与之进行比较(在%阈值内)。 假设浏览器的自动检测编码功能就是这样工作的。 |
|
|
3
13
分享我的解决方案,希望它可以帮助其他人,因为它可以帮助我从这些帖子和论坛。 背景我一直在研究和探索同样的解决方案。但是,我希望它是简单的或者稍微扭曲的。 然而,大多数尝试在这里以及其他来源提供复杂的解决方案,并深入到Unicode中, UTF-series ,BOM,编码,字节顺序。在这个过程中,我也去了越野和 Ascii Tables and Code pages 也是。 不管怎样,我提出了一个基于流阅读器和 自定义控件字符检查 . 它的构建考虑了论坛和其他地方提供的各种提示和技巧,例如:
我的目标是:
提供的解决方案适用于测试数据,包括MP3、EML、TXT、INFO、FLV、MP4、PDF、GIF、PNG、JPG。到目前为止,它给出了预期的结果。 解决方案的工作原理我依靠的是 StreamReader default constructor 在确定使用的与文件编码相关的特征方面做它能做的最好的事情。 UTF8Encoding 默认情况下。 我创建了我自己版本的检查自定义控件char条件,因为 Char.IsControl 似乎没用。它说:
因为文本文件至少包括CR和LF,所以它没有用处。 解决方案
如果你尝试以上的解决方案,告诉我它是否适合你。 其他有趣的相关链接: |
|
|
4
10
如果真正的问题是“是否可以使用streamreader/streamwriter在不进行修改的情况下读取和写入此文件?”,那么答案是:
|
|
|
5
8
虽然这不是万无一失的,但应该检查它是否包含二进制内容。
因为如果存在任何控制字符(除了标准
|
|
|
6
4
快速而脏的是使用文件扩展名并查找常见的文本扩展名,如.txt。为此,您可以使用 Path.GetExtension 打电话。任何其他东西都不会真正被归类为“快速”,尽管它很可能是脏的。 |
|
|
7
3
好问题!我很惊讶.NET并没有提供一个简单的解决方案。 下面的代码可以帮助我区分图像(PNG、JPG等)和文本文件。
我刚刚检查了连续的空值(
显然,这是一种快速而肮脏的方法,但是可以通过将文件分成10个512字节的块,并检查其中8个连续的空值(就个人而言,如果其中2个或3个匹配,我会推断它是一个二进制文件-空值在文本文件中很少见)。 这应该为你所追求的提供一个很好的解决方案。 |
|
|
8
2
一个真正肮脏的方法是构建一个只使用标准文本、标点符号、符号和空白字符的regex,在文本流中加载文件的一部分,然后对regex运行它。根据问题域中哪些文件是纯文本文件,没有成功的匹配将指示二进制文件。 要解释Unicode,请确保在流中标记编码。 这真是次优,但你说得又快又脏。 |
|
|
9
1
http://codesnipers.com/?q=node/68 描述如何使用字节顺序标记(可能出现在文件中)检测UTF-16和UTF-8。它还建议循环遍历一些字节,看看它们是否符合UTF-8多字节序列模式(如下),以确定您的文件是否是文本文件。
|
|
|
10
1
另一种方法是:确定二进制数组的长度,表示文件的内容,并将其与将给定的二进制数组转换为文本后的字符串长度进行比较。 如果长度相同,则文件中没有“不可读”符号,而是文本(我敢肯定是80%)。 |
|
|
user23819755 · 从文件加载的数据未按正确顺序返回 2 年前 |
|
|
Grekys · C数组元素全部变为相同值 2 年前 |
|
|
Deba · 为什么在cin语句中打印空格时,第0个字符没有打印出来? 2 年前 |
|
|
catodd · C-试图将整数和结构数组存储到二进制文件中 2 年前 |
|
|
heapyams · Java可执行文件无法读取资源文件夹[重复] 2 年前 |
|
|
Community wiki · 在文件中插入值 3 年前 |