2016-10-04 22 views
1
I 자동 변환 후 스위프트 3. 아이폰 OS (10)와 자동 변환까지 완전히 잘 작동 NSData+Compression.swift에 따라 확장 클래스는 다음과 같습니다에 LZMA 데이터 압축을 사용했다

:데이터 압축 3

import Compression 

extension Data { 
static func compress(_ data: Data) -> Data { 

    let sourceBuffer = (data as NSData).bytes.bindMemory(to: UInt8.self, capacity: data.count) 
    let sourceBufferSize = data.count 

    let destinationBuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: sourceBufferSize) 
    let destinationBufferSize = sourceBufferSize 

    let status = compression_encode_buffer(destinationBuffer, destinationBufferSize, sourceBuffer, sourceBufferSize, nil, COMPRESSION_LZMA) 

    if status == 0 { 
     print("Error with status: \(status)") 
    } 
    print("Original size: \(sourceBufferSize) | Compressed size: \(status)") 
    return Data(bytesNoCopy: UnsafeMutablePointer<UInt8>(destinationBuffer), count: status, deallocator: .free) 
} 
} 

이제이 메서드의 출력은 압축 된 크기가 0 인 상태에서 항상 비어 있습니다.이 코드의 문제점을 찾아 내도록 도와 줄 수 있습니까?

+0

아마도 대상 버퍼가 너무 작습니다. 압축 방법은 항상 입력보다 더 많은 출력을 생성 할 수 있습니다. –

+0

데이터 형식에 대해 [this] (https://github.com/mw99/DataCompression/) Swift 3 LibCompression 래퍼를 살펴볼 수 있습니다. 스트림 함수를 사용하므로 버퍼 크기에 대해 걱정할 필요가 없습니다. – LimeRed

답변

0

마틴 R은 대상 버퍼가 너무 작았다는 문제점을 제안했습니다.

대신 data.count을 사용하는 대신 (data as NSData).length을 사용하여 Swift 2의 NSData와 이전과 동일한 크기가됩니다. 또한 대상 버퍼 크기를 2 배로 늘 렸습니다. 항상 올바르게 작동 할 것입니다.

빠른 답변 주셔서 감사합니다.