2016-07-11 1 views
0

메모리 블록의 압축을 해제하려고하지만 압축되지 않은 원래 크기를 알지 못합니다. 그러나이 원래 메모리 블록의 최대 크기는 알 수 있습니다.LZ4 알 수없는 크기의 이진 메모리 블록 압축 해제

원본 압축되지 않은 크기를 모른 채 LZ4로 압축을 푸는 방법이 있습니까?

Short-Story-Long : 저는 Cereal이라는 타사 라이브러리를 사용하여 일련의 변수를 stringstream에 직렬화합니다. 시리얼은 '포터블 바이너리 형식'을 사용하여 데이터를 문자열 스트림으로 직렬화합니다. 즉, 엔디안이 유지되고 필요에 따라 직렬 변환 중에 호스트 시스템으로 변환 될 수도 있습니다. 문자열 스트림은 LZ4를 사용하여 압축되고 압축 해제 및 비 직렬화를 위해 원격 시스템으로 전송됩니다.

제 문제는 LZ4가 압축 된 데이터의 메모리 블록과 압축 된 데이터의 크기를 지정하는 정수를 출력한다는 것입니다. 압축을 풀려면 압축 된 크기와 원본 크기가 필요하며 압축 된 데이터 블록을 원격 컴퓨터에만 보냅니다.

그래, 원래 압축 된 크기를 모른 채 LZ4로 데이터 블록을 압축 해제 할 수있는 방법이 있습니까? 본질적으로 '완료된 데이터가 부족할 때 압축 해제를 시작하십시오'

답변

1

기능 LZ4_decompress_safe (https://github.com/Cyan4973/lz4/blob/master/lib/lz4.c#L1288 참조)은 최대 압축 해제 크기 만 필요합니다. 이 경우 압축 해제에 충분한 크기의 버퍼를 할당하여 사용할 수 있습니다.

그래서 원래의 압축되지 않은 크기도 원격 시스템으로 전송하십시오.

편집 : 귀하의 경우에는 LZ4 스트리밍 압축 풀기를 사용할 수도 있습니다. 자세한 내용은 this code sample을 참조하십시오.

+0

'LZ4_decompress_safe (const char * source, char * dest, int compressedSize, int maxDecompressedSize)'는 compressedSize가 필요합니다. 0/NULL을 전달하면 압축 해제가 실패합니다. 모든 압축 해제 방법은 알 수 없지만 최대 값을 가진 compressedSize/originalSize를 요청합니다. – KKlouzal

+0

압축 된 크기, 압축되지 않은 크기 또는 둘 다 가지고 있지 않음을 의미합니까? –

+0

'실제'압축 된 크기를 알지 못합니다. 단지 500 바이트 일지 모르지만 1436 바이트의보다 큰 버퍼 안에 보관됩니다. 1436을 'compressedSize'로 전달하면 실패하고 500을 성공하면 실패합니다. – KKlouzal

관련 문제