142 lines
4.7 KiB
C#
142 lines
4.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.IO;
|
|
using System.IO.Compression;
|
|
using System.Linq;
|
|
using System.Runtime.Serialization.Formatters.Binary;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
// 데이터 압축/해제 관련
|
|
namespace SystemX.Common.Archive
|
|
{
|
|
public static class XDataArchive
|
|
{
|
|
public static byte[] CompressDeflateByteToByte(byte[] ucData)
|
|
{
|
|
byte[] ucCompressedByte;
|
|
using (MemoryStream ms = new MemoryStream())
|
|
{
|
|
using (DeflateStream ds = new DeflateStream(ms, CompressionMode.Compress))
|
|
{
|
|
ds.Write(ucData, 0, ucData.Length);
|
|
}
|
|
ucCompressedByte = ms.ToArray();
|
|
}
|
|
|
|
return ucCompressedByte;
|
|
}
|
|
public static byte[] CompressGZipByteToByte(byte[] ucData)
|
|
{
|
|
byte[] ucCompressedByte;
|
|
using (MemoryStream ms = new MemoryStream())
|
|
{
|
|
using (GZipStream gs = new GZipStream(ms, CompressionMode.Compress))
|
|
{
|
|
gs.Write(ucData, 0, ucData.Length);
|
|
}
|
|
ucCompressedByte = ms.ToArray();
|
|
}
|
|
|
|
return ucCompressedByte;
|
|
}
|
|
public static byte[] DecompressDeflateByteToByte(byte[] ucCompressedData)
|
|
{
|
|
byte[] ucDecompressedByte;
|
|
|
|
MemoryStream resultStream = new MemoryStream();
|
|
using (MemoryStream ms = new MemoryStream(ucCompressedData))
|
|
{
|
|
using (DeflateStream ds = new DeflateStream(ms, CompressionMode.Decompress))
|
|
{
|
|
ds.CopyTo(resultStream);
|
|
ds.Close();
|
|
|
|
ucDecompressedByte = resultStream.ToArray();
|
|
}
|
|
}
|
|
|
|
return ucDecompressedByte;
|
|
}
|
|
public static byte[] DecompressGZipByteToByte(byte[] ucCompressedData)
|
|
{
|
|
byte[] ucDecompressedByte;
|
|
|
|
MemoryStream resultStream = new MemoryStream();
|
|
using (MemoryStream ms = new MemoryStream(ucCompressedData))
|
|
{
|
|
using (GZipStream gs = new GZipStream(ms, CompressionMode.Decompress))
|
|
{
|
|
gs.CopyTo(resultStream);
|
|
gs.Close();
|
|
|
|
ucDecompressedByte = resultStream.ToArray();
|
|
}
|
|
}
|
|
|
|
return ucDecompressedByte;
|
|
}
|
|
public static byte[] CompressDatasetToByte(DataSet ds)
|
|
{
|
|
//1. 데이터셋 Serialize
|
|
ds.RemotingFormat = SerializationFormat.Binary;
|
|
BinaryFormatter bf = new BinaryFormatter();
|
|
MemoryStream ms = new MemoryStream();
|
|
bf.Serialize(ms, ds);
|
|
byte[] inbyt = ms.ToArray();
|
|
|
|
//2. 데이터 압축
|
|
System.IO.MemoryStream objStream = new MemoryStream();
|
|
System.IO.Compression.DeflateStream objZS = new System.IO.
|
|
Compression.DeflateStream(objStream, System.IO.Compression.
|
|
CompressionMode.Compress);
|
|
objZS.Write(inbyt, 0, inbyt.Length);
|
|
objZS.Flush();
|
|
objZS.Close();
|
|
|
|
//3. 데이터 리턴
|
|
return objStream.ToArray();
|
|
}
|
|
public static DataSet DecompressByteToDataset(byte[] bytDs)
|
|
{
|
|
DataSet outDs = new DataSet();
|
|
MemoryStream inMs = new MemoryStream(bytDs);
|
|
inMs.Seek(0, 0); //스트림으로 가져오기
|
|
|
|
//1. 압축객체 생성- 압축 풀기
|
|
DeflateStream zipStream = new DeflateStream(inMs,
|
|
CompressionMode.Decompress, true);
|
|
byte[] outByt = ReadFullStreamToByte(zipStream);
|
|
zipStream.Flush();
|
|
zipStream.Close();
|
|
MemoryStream outMs = new MemoryStream(outByt);
|
|
outMs.Seek(0, 0); //2. 스트림으로 다시변환
|
|
outDs.RemotingFormat = SerializationFormat.Binary;
|
|
|
|
//3. 데이터셋으로 Deserialize
|
|
BinaryFormatter bf = new BinaryFormatter();
|
|
outDs = (DataSet)bf.Deserialize(outMs, null);
|
|
|
|
return outDs;
|
|
}
|
|
private static byte[] ReadFullStreamToByte(Stream stream)
|
|
{
|
|
//스트림을 Byte 배열로 변환
|
|
byte[] buffer = new byte[1000000];
|
|
using (MemoryStream ms = new MemoryStream())
|
|
{
|
|
while (true)
|
|
{
|
|
int read = stream.Read(buffer, 0, buffer.Length);
|
|
|
|
if (read <= 0)
|
|
return ms.ToArray();
|
|
|
|
ms.Write(buffer, 0, read);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|