/// <summary> /// Decompress a string /// </summary> /// <param name="compressedText">Compressed buffer</param> /// <param name="offset">Offset into buf to begin decompression</param> /// <returns>Decompressed string</returns> public static string DecompressString(byte[] compressedText, int offset, int dataLength) { int len = 0; int bytesReturned = 0; byte[] buf = ByteCompression.Decompress(compressedText, offset, dataLength, ref bytesReturned, ref len); if (buf == null) { return(null); } try { return(Encoding.Unicode.GetString(buf, 0, bytesReturned)); } finally { ByteCompression.Recycle(buf); } }
/// <summary> /// Decompress a string /// </summary> /// <param name="compressedText">Compressed buffer</param> /// <param name="offset">Offset into buf to begin decompression</param> /// <param name="bytesUsed">Used to inform caller of the number of bytes from buf that were actually decompressed</param> /// <returns>Decompressed string</returns> public static string DecompressString(byte[] compressedText, int offset, int dataLength, ref int bytesUsed) { try { int len = 0; int bytesReturned = 0; byte[] buf = ByteCompression.Decompress(compressedText, offset, dataLength, ref bytesReturned, ref len); bytesUsed = len; if (buf == null) { return(null); } try { if (bytesReturned < 1048576) { return(Encoding.Unicode.GetString(buf, 0, bytesReturned)); } else { int retry = 10; while (true) { try { retry--; string ret = ""; int o = 0; while (o < bytesReturned) { int read = 1048576; if ((bytesReturned - o) < 1048576) { read = (bytesReturned - o); } ret += Encoding.Unicode.GetString(buf, o, read); o += read; } return(ret); } catch (System.OutOfMemoryException ex) { if (retry < 0) { throw new Exception(System.Reflection.Assembly.GetEntryAssembly().GetName().Name + ".StringCompression.DecompressString", ex); } System.Threading.Thread.Sleep(10); } } } } finally { ByteCompression.Recycle(buf); } } catch (Exception ex) { STEM.Sys.EventLog.WriteEntry(System.Reflection.Assembly.GetEntryAssembly().GetName().Name + ".StringCompression.DecompressString", ex.ToString(), STEM.Sys.EventLog.EventLogEntryType.Error); throw; } }