【发布时间】:2021-11-16 10:09:03
【问题描述】:
我想读出文件的标题并将其与给定的签名进行比较。签名的开头可以有一个偏移量。
这是我目前的功能:
public FileTypeVerifyResult Verify(Stream stream)
{
stream.Position = 0;
var reader = new BinaryReader(stream);
var headerBytes = reader.ReadBytes(SignatureLength + this.OffSet);
return new FileTypeVerifyResult
{
Name = Name,
Description = Description,
IsVerified = Signatures.Any(signature =>
headerBytes.Skip(this.OffSet).Take(signature.Length)
.SequenceEqual(signature)
)
};
}
这目前适用于一个偏移量,但存在可以具有多个偏移量的扩展。所以我的第一个想法是使OffSet 属性成为具有所有偏移量的int[],但是我不知道这是否可以轻松地构建到这个 linq 表达式中。
此外,文件可以具有偏移量any(或任何其他表示文件中任何位置的值,例如-1)。怎么会有这样的东西?
【问题讨论】:
-
您需要处理掉您的阅读器和流。
-
属性不应该被键入为可变数组(例如
int[]),因为不清楚属性是否总是返回相同的数组 - 或者在每次调用时返回一个新数组 - 并且也不表示数组是否可变。相反,为什么不在Verify方法中添加一个params int[] offsets参数? -
你不应该盲目地设置
stream.Position = 0,因为不是每个Stream都是可搜索的(例如NetworkStream是不可搜索的)。您需要先检查if( stream.CanSeek )。