我對實作影像格式驗證感興趣。我正在獲取一個輸入檔案(如 IFormFile),我想將其編碼為位元組,并將這些位元組與格式(如 jpeg 和 png)的起始位元組進行比較。例如,如果檔案的前兩個位元組等于 jpeg 的位元組,則該檔案是 jpeg 影像。
附加的實作將整個檔案轉換為位元組陣列,這似乎效率低下:
using var stream = new MemoryStream();
file.CopyTo(stream);
byte[] checkIfImage = stream.ToArray();
然后,我們將它與 jpeg 或 png 的位元組進行比較。
var png = new byte[] { 137, 80 };
var jpeg = new byte[] { 255, 216 };
我不想創建這個包含所有檔案位元組的低效大陣列,而是想創建一個只包含前兩個位元組的陣列,這樣比較將是有效的。但是,我不能簡單地.Take(2)在.ToArray().
我該怎么辦?
謝謝!
uj5u.com熱心網友回復:
無論你有概念或以其他方式......既然你其他問題分配的MemoryStream,你可能也只是使用GetBuffer來訪問底層陣列。從那里你可以使用任何你喜歡的比較技術。
在這個例子中我使用Memory<T>和ReadOnlyMemory<T>并使用 SequenceEqual檢查圖案(ˉ\_(ツ)_/ˉ)
給定的
private static readonly (string Name, ReadOnlyMemory<byte> Pattern)[] _patterns =
{
("png", new byte[] {1, 2}),
("jpj", new byte[] {1, 216}),
};
用法
using var file = new MemoryStream(new byte[] {1, 2, 3, 4, 5});
using var stream = new MemoryStream();
file.CopyTo(stream);
var mem = stream.GetBuffer().AsMemory();
foreach (var (name, pattern) in _patterns)
if (pattern.Span.SequenceEqual(mem.Span(0,pattern.Span.Length)))
Console.WriteLine("Found : " name ", " Convert.ToHexString(pattern.Span));
輸出
Found : png, 0102
免責宣告 1:如果您使用的是舊的和被破壞的 .net 框架,那么所有賭注都將關閉。你需要用陣列和蠟筆來做到這一點
免責宣告 2:這并不意味著成為世界上最偉大的代碼,這只是一種致敬
uj5u.com熱心網友回復:
只需使用stream.Read 方法
var firstBytes = new byte[2];
var nrBytesRead = filestream.Read(firstBytes);
if(nrBytesRead == firstBytes.Length){
// do the comparison
}
像binaryreader這樣的類也可能有用。將整個流讀取到記憶體可能很方便,但如果性能或記憶體使用是一個問題,通常應該避免。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/340815.html
下一篇:基于多維陣列生成標記
