出于安全考虑,我试图通过其字节验证该文件是.rar文件。以下代码是我的代码,唯一的问题是子标头与从文件生成的标头不匹配。我注意到不同文件的不同之处。你能解释一下为什么吗?
static bool IsRARFile(string filePath)
{
bool isDocFile = false;
//
// File sigs from: http://www.garykessler.net/library/file_sigs.html
//
string msOfficeHeader = "52-61-72-21-1A-07-00-CF";
string docSubHeader = "64-2E-63-73";
using (Stream stream = File.OpenRead(filePath))
{
//get file header
byte[] headerBuffer = new byte[8];
stream.Read(headerBuffer, 0, headerBuffer.Length);
string headerString = BitConverter.ToString(headerBuffer);
if (headerString.Equals(msOfficeHeader, StringComparison.InvariantCultureIgnoreCase))
{
//get subheader
byte[] subHeaderBuffer = new byte[4];
stream.Seek(512, SeekOrigin.Begin);
stream.Read(subHeaderBuffer, 0, subHeaderBuffer.Length);
string subHeaderString = BitConverter.ToString(subHeaderBuffer);
if (subHeaderString.Equals(docSubHeader, StringComparison.InvariantCultureIgnoreCase))
{
isDocFile = true;
}
}
}
return isDocFile;
}
答案 0 :(得分:1)
这是因为你刚刚从某个地方为不同的文件类型复制了一个函数,并不是每个文件类型都有任何“subheader”的概念。在RAR的情况下,您只需要检查主标题。
我还建议修改变量的命名,如果函数说它正在检查RAR类型并且内部所有变量都引用DOC,那么这是一个非常错误的错误。