달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

'C# 압축'에 해당되는 글 1건

  1. 2014.08.01 C# GZIP 압축이 Unity에서 안될때..

C#의 GZipStream을 이용해 패킷을 압축해서 보내고 받고 테스트를 하니 잘된다.

그래서 unity에 적용!!!!! 하자 마자 오류 ...

유니티가 GZipStream과의 호환성 문제가 있나보다.

 

이것 저것 찾다가 sharpZipLib 라는걸 추천하길래 써봤다.

 

현재 서버의 구조는

 

1. 버퍼 생성

2. 버퍼의 데이터를 압축

3. 데이터를 암호화

4. 전송

 

1. 수신

2. 복호화

3. 압축 해제

4. 버퍼를 읽어 들임.

 

순서다.

 

압축 코드는 초 간단..

암호화와 압축이 옵션이라 호출 하는 쪽에서 버퍼를 공유하기 위해 out byte[] ret 으로 받고 있지만  그냥 애초에 리턴으 byte[]로 받는게 보통이다..

 

        private void Compress(byte[] data, out byte[] ret)
        {
            using(MemoryStream ms = new MemoryStream(data))  //  패킷 데이터를 넣어 메모리 스트림 생성 (input)
            {
                using(MemoryStream zip = new MemoryStream())  // 리턴받을 메모리 스트림 생성(output)
                {
                    BZip2.Compress(ms, zip, false, 3);  // input 스트림의 데이터를 output 스트림으로 압축하여 저장
                    ret = zip.ToArray();
                }
            }
        }

        public void Decompress(byte[] data, out byte[] ret)
        {
            using(MemoryStream ms = new MemoryStream(data))  // 패킷 데이터를 넣어 메모리 스트림 생성
            {
                using(MemoryStream zip = new MemoryStream()) // 리턴받을 메모리 스트림 생성
                {
                    BZip2.Decompress(ms, zip, false);  // 압축 해제 하여 output 스트림에 저장
                    ret = zip.ToArray();
                }
            }
        }

 

이렇게 데이터를 보내고 받으니 unity 에서도 잘 된다.

패킷 사이즈는 총 12000 byte 정도가 4000 byte 정도까지 줄어들었다.

 

 

Posted by SadDev
|