문제

.Net 및 Mono에서 실행되어야 하는 특별한 ZLib 구현을 구현해야 합니다.데이터/문자열 메시지는 소켓을 통해 수신되므로 체크섬이 누락되었습니다.이것은 파일이 아닌 원시 문자열 데이터에 관한 것입니다.

    unsigned char zlib_header[]={
// custom additional Zlib Id
       'Z',    // Our own ID
// The normal GZIP header
       0x1f,
       0x8b,   // GZIP ID
       0x08,   // Deflated
       0x00,   // Flags
       0, 0, 0, 0, // Timestamp,
       0x00,   // Extra flags
       0x00,   // OS identifier
// afterwards compressed data without a checksum
};

GZipStream, DeflateStream으로 데이터 압축을 풀어보려고 했는데, 체크섬이 없어서 GZStream이 실패하는 것 같습니다.나는 또한 다양한 오프셋을 시도했지만 운이 없었습니다.어쨌든 데이터가 소켓을 통해 수신되기 때문에 체크섬은 사용되지 않습니다. 따라서 ZLib 체크섬은 추가 오버헤드가 됩니다.제가 뭔가를 놓쳤나요? 아니면 체크섬을 추가하고 올바른 라이브러리를 호출하는 방법을 설명해 주시겠습니까? 아니면 Mono 및 .Net을 지원하는 타사 라이브러리를 살펴보아야 합니까?편집하다:이 작업은 적어도 1초에 한 번씩 수행되므로 성능이 매우 중요합니다.마지막에 Interop을 통해 C-Lib을 사용하도록 권장하시겠습니까?저는 현재 항상 Invalid Data Exception을 받고 있으며 이는 잘못된 체크섬과 관련이 있다고 가정합니다.이것은 내가 성공하지 못한 채 사용하려고 시도한 실제 코드입니다.

const int HeaderSize = 1;
System.IO.MemoryStream ms = new System.IO.MemoryStream(compressedBuffer, HeaderSize, compressedBuffer.Length-HeaderSize);//remove the additional Z from the header
GZipStream zipStream = new GZipStream(ms, CompressionMode.Decompress,true);
byte[] deCompressedBytes = new byte[actualBufferLength* 10];
int resultSize=zipStream.Read(deCompressedBytes, 0, actualBufferLength);//get rid of the header      
UTF8Encoding enc = new UTF8Encoding();
string result = enc.GetString(deCompressedBytes, 0, resultSize);
도움이 되었습니까?

해결책

체크섬과 관련이 있습니까?

32비트 체크섬은 GZIP 형식에서 선택 사항이 아닙니다."데이터가 소켓을 통해 수신되었으므로 체크섬이 누락되었습니다"라는 말의 의미를 이해하지 못합니다.운반비둘기를 통해 데이터를 얻는지는 중요하지 않습니다.유효한 GZIP 스트림인 경우 32비트 CRC가 있어야 합니다.누가 또는 무엇이 원본 데이터를 생산했습니까?

GZIP 사양에는 16비트 체크섬이라는 선택적 부분이 있습니다.(포함 여부는 GZIP 바이트스트림이 생성된 방식에 따라 결정되지 않습니다.) System.IO.GZipStream 클래스는 이 CRC16이 없는 GZIP 스트림과 이를 포함하는 스트림을 기꺼이 받아들입니다.

코드에 다른 문제가 있습니다.코드의 실제 버퍼 길이 - 그게 무엇인가요?압축이 풀린 데이터를 보관하는 버퍼의 길이는 확실히 아닙니다.그것은 10배입니다.그러나 10x는 꽤 임의적으로 보입니다.압축률이 매우 높은 데이터의 경우 10배를 초과할 수 있습니다.압축 해제 시 스트리밍 접근 방식을 사용하는 것이 좋습니다.

초당 1회의 압축 해제를 처리할 수 있는지 여부에 관해서는 그렇습니다. System.IO.GZipStream은 충분히 작은 데이터 청크에도 충분히 빠릅니다.기본 C/C++ 라이브러리로 이동할 필요가 없을 것 같습니다.

추신:그만큼 DotNetZip 라이브러리에는 오픈 소스인 GZipStream이 포함되어 있습니다.상자에서 꺼내서 사용할 수도 있고, 원한다면 GZip 파일만 가져오면 됩니다.

다른 팁

GzipStream 대신 Deflatestream을 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top