我有這個 C# 代碼,它能夠MemoryStream在解壓縮之前驗證 a 是否使用 GZip 壓縮:
// Ref: https://stackoverflow.com/a/6059342/16631852
if (input.ReadByte() == 0x1f && input.ReadByte() == 0x8b)
...
public MemoryStream Decompress(MemoryStream input)
{
MemoryStream wmfStream;
input.Position = 0;
if (input.ReadByte() == 0x1f && input.ReadByte() == 0x8b)
{
input.Position = 0;
wmfStream = new MemoryStream();
var buffer = new byte[1024];
var compressedFile = new GZipStream(input, CompressionMode.Decompress, true);
int bytesRead;
while ((bytesRead = compressedFile.Read(buffer, 0, buffer.Length)) > 0)
{
wmfStream.Write(buffer, 0, bytesRead);
}
}
else
{
wmfStream = input;
}
wmfStream.Position = 0;
return wmfStream;
}
后來,我發現此代碼的一個可能的 Delphi 變體(在我看來)使用以下方法進行 GZip 解壓縮System.Zlib:
uses System.ZLib;
const
ZLIB_GZIP_WINDOWBITS = 31;
ZLIB_DEFLATE_WINDOWBITS = 15;
procedure ZLibDecompressStream(Source, Dest: TStream; const GZipFormat: Boolean = True); overload;
procedure ZLibDecompressStream(Source, Dest: TStream; const GZipFormat: Boolean);
var
WindowBits: Integer;
UnZip: TDecompressionStream;
begin
if GZipFormat then
WindowBits := ZLIB_GZIP_WINDOWBITS
else
WindowBits := ZLIB_DEFLATE_WINDOWBITS;
UnZip := TDecompressionStream.Create(Source, WindowBits);
try
Dest.CopyFrom(UnZip, 0);
finally
FreeAndNil(UnZip);
end;
end;
如何MemoryStream在初始化解壓縮之前驗證(在 Delphi 代碼中)是否使用 GZip 壓縮(類似于 C# 代碼)?
uj5u.com熱心網友回復:
C# 代碼正在檢查兩個位元組的 GZip 標頭:
0x1f 0x8b
你可以在 Delphi 中做同樣的事情:
function IsGZipStream(Stream: TStream): Boolean;
var
B1, B2: Byte;
begin
Result := False;
if Stream.Size >= 2 then
begin
Stream.Read(B1, 1);
Stream.Read(B2, 1);
Result := (B1 = $1F) and (B2 = $8B);
Stream.Seek(-2, soFromCurrent);
end;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/537867.html
上一篇:何時在docker中重建影像?
下一篇:大十進制字串到二進制字串
