2009-02-04 23 views
7

Tôi đang xây dựng một ứng dụng mạng cần có khả năng chuyển từ lưu lượng truy cập mạng bình thường sang luồng nén, luồng trung bình zlib. Suy nghĩ của tôi về vấn đề này liên quan đến chuyển đổi boolean rằng khi bật sẽ làm cho mã mạng truyền tất cả dữ liệu qua lớp mà tôi có thể nạp IEnumerable<byte> vào, và sau đó kéo luồng giải nén, chuyển nó sang mã phân tích giao thức đã tồn tại.Thực hiện zlib tốt trong .NET?

Những điều tôi đã nhìn:

  • ZLib.NET - Có vẻ như một chút ... Ecclectic, và không hoàn toàn những gì tôi muốn. Vẫn sẽ tạo ra một khởi đầu tốt đẹp để xây dựng ra mặc dù. (Jon Skeet's comments here hầu như không truyền cảm hứng cho tôi.)
  • SharpZipLib - Điều này dường như không hỗ trợ zlib? bất cứ ai có thể xác nhận hay phủ nhận điều này?

Tôi rất thích và tất cả các giải pháp được quản lý, nhưng chúng ta hãy thực hiện ... có bất kỳ triển khai nào khác của thư viện này trên .NET không. Có thể phù hợp hơn với những gì tôi muốn, hoặc tôi nên dùng ZLib.NET và xây dựng nó như là một sự khởi đầu?

PS:

Jon hỏi cho cụ thể hơn, vì vậy ở đây nó được.

Tôi đang cố triển khai MCCP 2. Điều này liên quan đến một tín hiệu được gửi trong luồng mạng và mọi thứ sau tín hiệu này là luồng dữ liệu nén zlib. Có liên kết đến chính xác những gì họ có ý nghĩa bởi điều đó trong liên kết ở trên. Dù sao, để được rõ ràng, tôi đang vào cuối recieving này (khách hàng, không phải máy chủ), và tôi có một bó dữ liệu đọc ra khỏi dòng mạng đã có, và chuyển đổi sẽ được ở giữa này (trong tất cả có khả năng ít nhất), vì vậy bất kỳ giải pháp nào cũng cần có thể có thêm một số dữ liệu được nạp vào nó, trước khi nó chiếm lấy NetworkStream (hoặc tôi tự nạp vào phần còn lại của dữ liệu).

+0

Đầu trang để bắt đầu zip có được cung cấp một gói cụ thể không? –

+0

Tôi không biết gì về điều này. Cá nhân tôi không chú ý quá nhiều đến mức độ chi tiết đó. Tôi nghi ngờ rằng sẽ được thực hiện máy chủ cụ thể, không có đề cập đến nó trong bất kỳ tài liệu mô tả. –

+0

Bạn đã bao giờ có thư viện tốt cho MCCP 2 chưa? – m4tt1mus

Trả lời

2

Câu trả lời được chấp nhận trong bài đăng này: Zlib-compatible compression streams, có giúp gì cho bạn không?

+0

Tôi sẽ thừa nhận rằng đã nhìn thấy điều đó, và không thử GZipStream, nhưng chủ yếu là vì những lưu ý lớn trên trang chủ zlib nói rằng nó không phải là gzip, vì vậy tôi nghĩ rằng tôi muốn hỏi đầu tiên anyway. –

+1

GZipStream không hoạt động, nó ném một InvalidDataException, phàn nàn về các tiêu đề và số ma thuật. –

+0

@MatthewScharley Bạn có thể muốn 'DeflateStream', không phải' GZipStream'. Sau này kết thúc tốt đẹp trước đây và thêm/kiểm tra tổng kiểm tra CRC (và có thể một số tiêu đề là tốt). –

0

tôi có thể khuyên bạn nên wrapper zlib Gerry Shaw cho NET:

http://www.organicbit.com/zip/

+0

Đây là bản phát hành trước, và tôi đang xây dựng chống lại mono, vì vậy tôi bị cám dỗ để chỉ cứu cơn đau đầu và tránh xa, nhưng tôi vẫn sẽ kiểm tra. –

+0

Chúng tôi đã sử dụng sản phẩm này trong hơn 2 năm nay, cả với .NET và Mono. Không đau cho đến nay. –

3

SharpZipLib không hỗ trợ ZLib. Nhìn vào this FAQ entry.

Ngoài ra, bạn đã kiểm tra xem không gian tên System.IO.Compression có hỗ trợ những gì bạn cần không?

Tôi sẽ không sử dụng IEnumerable<byte> mặc dù - luồng được thiết kế để được ghép với nhau.

EDIT: OK ... có vẻ như bạn cần một luồng hỗ trợ đệm, nhưng với nhiều quyền kiểm soát hơn số BufferedStream sẽ cung cấp. Bạn sẽ cần phải "tua lại" luồng nếu bạn thấy nút bật tắt giải nén và sau đó tạo một GZipStream ở trên cùng. Bộ đệm của bạn sẽ cần phải có ít nhất là lớn như cuộc gọi lớn nhất của bạn để đọc() để bạn luôn có thể có đủ bộ đệm để tua lại.

+0

Tôi đồng ý về điểm của bạn về điều IEnumerable ... nhưng thực tế của vấn đề là, tôi không thể tìm cách đẩy dữ liệu mà tôi đã đọc vào dòng zlib (vì quá trình chuyển đổi này xảy ra giữa luồng) trước khi kết nối luồng mạng vào nó. Có đề xuất nào không? –

+0

Nó không hoàn toàn rõ ràng với tôi những gì bạn đang làm. Bạn có hai luồng đầu ra khác nhau và bạn muốn chuyển đổi giữa chúng? Trong thực tế, tôi không thực sự "có được" cho dù bạn đang đọc hoặc viết. Giải thích thêm trong câu hỏi có thể mang lại những ý tưởng tốt hơn :) –

+0

Theo yêu cầu, thông tin thêm! –

0

Theo như tôi biết thư viện ZLib (gzip) không hỗ trợ liệt kê các tệp trong tiêu đề. Giả sử rằng vấn đề với bạn, nhưng nó có vẻ là một thiếu sót lớn.Đây là khi tôi sử dụng thư viện zip sắc nét cách đây một lúc, vì vậy tôi sẵn sàng xóa bỏ điều này :)

+0

Đây là tính năng nén qua mạng cho bảng điều khiển từ xa. Không có tên tệp. Vì vậy, nó không hoàn toàn quan trọng. Nhưng như một câu trả lời cho câu trả lời của bạn, có một vài nén mà không (gzip và bzip2 đến), đó là lý do tại sao chúng thường được sử dụng song song với tar. –

+0

Đây thực sự là thư viện .NET để nén (gzip ngoài đỉnh đầu của tôi) mà không hiển thị tên tập tin –

+0

Xin lỗi monoxide Tôi nên đọc câu hỏi rõ ràng hơn ... tạm biệt poste trong 10 phút –

3

Bao gồm trong DotNetZipZlibStream, để nén hoặc giải nén các luồng dữ liệu zlib. Bạn không hỏi, nhưng đó cũng là một GZipStream và một DeflateStream. Cũng như một lớp ZlibCodec, nếu đó là điều của bạn. (chỉ thổi phồng hoặc làm lệch bộ đệm, trái với luồng).

DotNetZip là thư viện được quản lý hoàn toàn với giấy phép tự do. Bạn không cần phải sử dụng bất kỳ khả năng .zip nào để có được công cụ Zlib. Và các công cụ zlib được đóng gói như một DLL riêng biệt (nhỏ hơn) chỉ dành cho mục đích này.

Các vấn đề liên quan