2017-03-13 9 views
2

작은 크기의 데이터 묶음을 압축하는 iOS 앱이 있습니다. LZ4 모드에서 실행되는 compression_encode_buffer를 사용하여 내 필요에 충분히 빨리 수행합니다.iOS의 compression_encode_buffer에서 LZ4 출력 디코딩

나중에 Apple 제품이 아닌 장치에서 파일을 만들고 디코딩합니다. 이전에는 ZLIB 압축 모드를 사용하고 있었고 C#에서 System.IO.Compression.DeflateStream을 사용하여 성공적으로 디코딩 할 수있었습니다.

그러나 LZ4 출력으로 시간을 보내고 있습니다. LZ4 문서 here을 기반으로, Apple은 스트림을 4 바이트 매직 번호, 4 바이트 압축 해제 크기 및 4 바이트 압축 크기로 시작하는 블록 묶음으로 나눕니다. 이 모든 것이 합리적입니다. 파일을 구문 분석하여 raw LZ4 청크로 변환 할 수 있습니다. 버퍼 iOS 출력의 각 청크는 약 65,635 바이트로 압축이 풀리고 내 경우에는 약 10 개가 있습니다.

그러나 다음과 같이 : 나는 남겨진 LZ4 덩어리로 무엇을해야할지 몰라. 나는 LZ4net의 LZ4.LZ4Stream, LZ4net의 LZ4.LZ4Codec (첫 번째 블록을 관리하지만 두 번째 피드를 제공 할 때 실패 함)로 디코딩 해 보았습니다. 또한 데이터를 디코딩하기 위해 여러 C++ 라이브러리를 사용해 보았습니다. 각각은 iOS 압축 기능이 비표준 방식으로 인코딩 된 헤더를 찾는 것처럼 보입니다.

답변

2

응답 내 자신 : 나는 실제로이 작업을 얻을 수 없습니다,하지만 난 쓰지 않았다 https://opensource.apple.com/source/xnu/xnu-3789.21.4/osfmk/vm/lz4.c.auto.html

편집 후 : (자신의 원료 저장 형식을 처리하는 데 필요한 수정을) 애플의 LZ4 압축 해제는 여기 Apple의 LZFSE 압축 해제기를 발견했기 때문에 많은 시간을 보냈습니다.

LZFSE 압축 해제 기는 여기에서 찾을 수 있습니다. https://github.com/lzfse/lzfse