我试图区分“文本文件”和“二进制”文件,因为我实际上想忽略具有“不可读”内容的文件。
我有一个文件,我认为它是 GZIP 存档。我试图通过检测幻数/文件签名来忽略此类文件。如果我在 Notepad++ 中使用十六进制编辑器插件打开文件,我可以看到前三个十六进制代码是1f 8b 08
.
但是,如果我使用读取文件StreamReader
,我不知道如何获取原始字节..
using (var streamReader = new StreamReader(@"C:\file"))
{
char[] buffer = new char[10];
streamReader.Read(buffer, 0, 10);
var s = new String(buffer);
byte[] bytes = new byte[6];
System.Buffer.BlockCopy(s.ToCharArray(), 0, bytes, 0, 6);
var hex = BitConverter.ToString(bytes);
var otherhex = BitConverter.ToString(System.Text.Encoding.UTF8.GetBytes(s.ToCharArray()));
}
在 using 语句的末尾,我有以下变量值:
hex: "1F-00-FD-FF-08-00"
otherhex: "1F-EF-BF-BD-08-00-EF-BF-BD-EF-BF-BD-0A-51-02-03"
两者都不以 Notepad++ 中显示的十六进制值开头。
是否可以通过读取文件的结果获取原始字节StreamReader
?
您的代码尝试将二进制缓冲区更改为字符串。 NET 中的字符串是 Unicode,因此需要两个字节。如您所见,结果有点不可预测。
只需使用 BinaryReader 及其读取字节数 http://msdn.microsoft.com/en-us/library/system.io.binaryreader.readbytes.aspx method
using(FileStream fs = new FileStream(@"C:\file", FileMode.Open, FileAccess.Read))
{
using (var reader = new BinaryReader(fs, new ASCIIEncoding()))
{
byte[] buffer = new byte[10];
buffer = reader.ReadBytes(10);
if(buffer[0] == 31 && buffer[1] == 139 && buffer[2] == 8)
// you have a signature match....
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)