2010-06-15 41 views
24

Tôi đang tìm một số đề xuất về nén dữ liệu trong .NET, ngoài việc sử dụng lớp GZipStream. Tôi đang tìm kiếm các mảng byte nhanh và cao để có thể gửi chúng qua tcp.Đề xuất cho thư viện nén .NET

Cảm ơn bạn.

+0

Sẽ hữu ích nếu bạn giải thích tại sao/nếu bạn không thích 'GZipStream'. –

+0

Không nói rằng tôi không thích nó - chỉ tìm kiếm các giải pháp thay thế có thể cho tôi hiệu suất tốt hơn và tỷ lệ nén cao hơn. Các thư viện thương mại cũng được chào đón là –

Trả lời

4

SharpZipLib là giải pháp thay thế. Người ta nói rằng nó được viết chu đáo hơn GZipStream thư viện khuôn khổ

+0

Tôi chắc chắn sẽ kiểm tra nó - cảm ơn –

+7

SharpZipLib không bị lỗi và lỗi. Bản phát hành cuối cùng vào tháng 6 năm 2010. Đôi khi, vấn đề với các tệp zip được tạo bởi 7zip, ioniczip, v.v. mặc dù các tệp zip hoàn toàn ổn. Chúng tôi sử dụng nó cho một thành phần tại nơi làm việc của mình và phải cố gắng sửa chữa nguồn và xây dựng cục bộ, không phải là một thỏa thuận lớn, nhưng không phải thứ bạn muốn tham gia nếu bạn đang tìm kiếm thư viện zip chìa khóa trao tay . – aggieNick02

+0

@ aggieNick02 Bạn có thể tải lên mã nguồn cố định không? – mafu

8

DotNetZip cung cấp hỗ trợ bản địa và có một API khá thân thiện và là quan điểm của tôi linh hoạt hơn SharpZipLib:

DotNetZip

EDIT: Thật không may, DotNetZip có một số vấn đề quan trọng và dự án dường như không còn được duy trì tích cực nữa. Do đó, thư viện này không thực sự được khuyến nghị sử dụng trong mã sản xuất.

Lựa chọn thay thế tốt hơn sẽ là sử dụng SharpZipLib (nếu bạn tuân thủ giấy phép dựa trên GPL), một trong số .NET ports of zlib hoặc hỗ trợ zip của .NET 4.5 như được hiển thị trong this answer.

+0

Tôi đã có trải nghiệm xấu với DotNetZip, nó không thể mở các tệp nén Zip hoàn toàn có thể mở được với các thư viện khác. Nó ném ví dụ OverflowException vì một lý do nào đó mà tôi không thể hiểu được. – lama12345

+0

@ lama12345: Cảm ơn bạn đã chỉ ra điều này. Bây giờ, tôi cũng nhận thức rõ về các vấn đề DotNetZip vì những vấn đề này cũng đã khiến tôi bị cắn. Tôi đã cập nhật câu trả lời của mình. –

+0

@Cheeso: Mọi cập nhật về tương lai của dự án DotNetZip? Có cách nào dự án có thể được hỗ trợ không? –

10

Nếu bạn đang nén dữ liệu, thì bạn có thể xem xét tuần tự mật độ cao, thay vì nén. Một cái gì đó như protobuf. Có một số few C# implementations here. Đối với các đối tượng hiện có, protobuf-net là IMO đơn giản nhất để thực hiện (tiết lộ: Tôi là tác giả - nhưng nó là miễn phí, vv). Bạn chỉ cần tuần tự hóa luồng hoặc nếu bạn muốn có một byte[], một MemoryStream riêng biệt.

Đối sử dụng liên tục trên một ổ cắm (chứ không phải là yêu cầu kín đáo/phản ứng của HTTP), tôi sẽ đề nghị xem xét các Serializer.SerializeWithLengthPrefix/Serializer.DeserializeWithLengthPrefix hoạt động (protobuf không tự bao gồm một terminator, do đó, một length- tiền tố là cần thiết để xử lý các tin nhắn riêng biệt).

+0

rất thú vị - tôi sẽ thử. cảm ơn –

+0

Marc, "serialization mật độ cao" có nghĩa là gì, đặc biệt là trái ngược với nén? Liệu nó có sử dụng bất kỳ lược đồ nén nào hay chỉ là một cách hiệu quả để biểu diễn dữ liệu? Bạn có thể đưa ra một lời giải thích ngắn hoặc bất kỳ con trỏ để đọc trên? –

+0

@ 0xA3 - ý tôi là: nếu đây là dữ liệu ứng dụng điển hình (mà bạn có thể đại diện dưới dạng xml hoặc JSON), thì hãy sử dụng trình nối tiếp khác để viết cùng một dữ liệu với ít byte hơn. Vì vậy, thay vì '', hãy viết 2 hoặc 3 byte để thay thế. Không thích hợp cho * tùy ý * 'byte []' mặc dù. –

1

.NET 3+ đã hỗ trợ Zip tích hợp ngay bây giờ, với lớp ZipPackage.

+0

Thật không may, điều này chỉ cung cấp một số loại hỗ trợ zip. Nó cho phép bạn tạo các gói "dựa trên zip", nhưng các gói này không phải là các tệp zip thuần túy mà là các gói như được mô tả trong các quy ước OpenPackaging (định dạng OPC). Các gói này bao gồm các phần tử PackagePart và PackageRelationship. Định dạng này có lẽ được biết đến nhiều nhất là định dạng vùng chứa được sử dụng bởi định dạng Office OpenXML. –

+0

Còn thư viện zip của IONIC thì sao? –

1

LZMA được coi là một trong những phương pháp nén tốt nhất. 7-Zip là một phạm vi công cộng thực hiện SDK của LZMA, tự do tải về ở đây:

http://www.7-zip.org/sdk.html

Wikipedia on compression algorithms:

thuật toán LZMA

7z của đạt đến một tỷ lệ nén cao hơn so với RAR, trừ "đa phương tiện "các tệp như .wav và .bmp tệp nơi RAR sử dụng các quy trình chuyên biệt hoạt động tốt hơn LZMA. [7] Phần mềm nén miễn phí khác như như NanoZip và FreeArc thường là hoạt động tốt hơn WinRAR. [8]

+0

Im một fan hâm mộ lớn của 7-zip nhưng không chắc chắn làm thế nào có thể truy cập api được. –

+2

Liên kết trỏ tới LZMA SDK có API C# và là miền công cộng. – code4life

+0

Đáng buồn thay, C# SDK không được cập nhật trong 10 năm và không hỗ trợ LZMA2. – mafu