我有一个解析二进制文件的代码。它使用Span<byte>
在函数之间传递数据块,以避免不必要的内存分配。
简化示例:
class Reader {
bool IsCompressed { get; set; }
public byte[] Data { get; set; }
function ReadOnlySpan<byte> ReadBlock() {
...
}
public function Read() {
if (IsCompressed) {
Data = ???
} else {
Data = ReadBlock.ToArray();
}
}
我可以使用Syste.IO.Compression.DeflateStream
解压缩数据,但此类仅接受Stream
作为输入,因此我必须将ReadOnlySpan<byte>
转换为流,从而为{{1}分配内存}。
byte[]
有没有办法将using(var stream = new MemoryStream(buffer.ToArray())) {
using(var deflateStream = new DeflateStream(stream, CompressionMode.Decompress)) {
Data = ... read from deflateStream
}
}
传递给ReadOnlySpan<byte>
而不分配不必要的内存?或者是否有其他库可以直接从DeflateStream
解压缩数据?
我使用的是.NET Core 2.1.0-preview1-26103-03,但如果需要,我可以使用任何其他版本。
答案 0 :(得分:3)
自2018年1月起,ReadOnlySpan<byte>
没有任何内置支持,但正如Stephen Toub在GitHub指出的那样,UnmanagedMemoryStream
<可以解决这个问题。 / p>
private unsafe byte[] Decompress(ReadOnlySpan<byte> buffer, int decompressedSize) {
fixed (byte* pBuffer = &buffer[0]) {
using (var stream = new UnmanagedMemoryStream(pBuffer, buffer.Length)) {
using (var deflateStream = new DeflateStream(stream, CompressionMode.Decompress)) {
var data = ArrayPool<byte>.Shared.Rent(decompressedSize);
deflateStream.Read(data, 0, decompressedSize);
return data;
}
}
}
}