You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

102 lines
2.2 KiB

//-----------------------------------------------------------------------
// <copyright file="Compression.cs" company="Mapbox">
// Copyright (c) 2016 Mapbox. All rights reserved.
// </copyright>
//-----------------------------------------------------------------------
namespace Mapbox.Utils
{
using System.IO;
using Mapbox.IO.Compression;
/// <summary> Collection of constants used across the project. </summary>
public static class Compression
{
/// <summary>
/// Decompress the specified buffer previously compressed using GZip.
/// </summary>
/// <param name="buffer">
/// The GZip'ed buffer.
/// </param>
/// <returns>
/// Returns the uncompressed buffer or the buffer in case decompression
/// is not possible.
/// </returns>
public static byte[] Decompress(byte[] buffer)
{
// Test for magic bits.
if (buffer.Length < 2 || buffer[0] != 0x1f || buffer[1] != 0x8b)
{
return buffer;
}
using (GZipStream stream = new GZipStream(new MemoryStream(buffer), CompressionMode.Decompress))
{
const int Size = 4096; // Pagesize.
byte[] buf = new byte[Size];
using (MemoryStream memory = new MemoryStream())
{
int count = 0;
do
{
try
{
count = stream.Read(buf, 0, Size);
}
catch
{
// For now we return the uncompressed buffer
// on error. Assumes the magic check passed
// by luck.
return buffer;
}
if (count > 0)
{
memory.Write(buf, 0, count);
}
}
while (count > 0);
buffer = memory.ToArray();
}
}
return buffer;
}
public static byte[] Compress(byte[] raw, CompressionLevel compressionLevel)
{
using (MemoryStream memory = new MemoryStream())
{
using (GZipStream gzip = new GZipStream(memory, compressionLevel))
{
gzip.Write(raw, 0, raw.Length);
}
return memory.ToArray();
}
}
public static byte[] CompressModeCompress(byte[] raw)
{
using (MemoryStream memory = new MemoryStream())
{
using (GZipStream gzip = new GZipStream(memory, CompressionMode.Compress, true))
{
gzip.Write(raw, 0, raw.Length);
}
return memory.ToArray();
}
}
}
}