2011-02-02 44 views
29

Tôi đang tìm JavaScript triển khai các thuật toán thổi phồng chuỗi. Tôi muốn nén ở phía máy chủ (Java) và giải nén ở phía máy khách (JavaScript).JavaScript: Giải nén/thổi phồng/giải nén/giải nén chuỗi

tôi đã tìm thấy:

unzip strings in javascript
Đó là một được đánh dấu là đã trả lời với một câu trả lời cho vấn đề khác nhau. Các câu trả lời khác cũng dành cho một thứ khác (giải nén các tập tin ở định dạng ZIP).

JavaScript inflate implementation (possibly FF 3.6 only)
Điều này gần nhất với những gì tôi cần. Tuy nhiên tôi muốn có một số lựa chọn thay thế.

Đề xuất?
Cảm ơn, Ondra

Cập nhật: Tôi có một trường hợp sử dụng cụ khá, xin đừng trả lời "Đừng làm điều đó trong JavaScript." Tôi đang viết một công cụ báo cáo "ngoại tuyến" (khi được tạo, nó được đặt vào một cửa hàng tĩnh) và giảm phát có thể tiết kiệm megabyte cho một báo cáo. Tôi bị ràng buộc bởi các ứng dụng khác nên tôi không thể lưu trữ nó dưới dạng tệp zip.

+3

Vấn đề chính là JavaScript không có cơ sở để thao tác dữ liệu thô. Tất cả các số đều là dấu phẩy động và tất cả các giá trị chuỗi được giữ dưới dạng UTF-16 (các ký tự 2 byte). Không có kiểu dữ liệu "mảng byte", do đó việc thực hiện nén/giải nén khó khăn hơn và hiệu quả hơn rất nhiều. – Pointy

+4

Không đúng sự thật, có hỗ trợ cho dữ liệu nhị phân trong các triển khai JavaScript gần đây, dựa trên [Đặc tả mảng được đánh máy] (http://www.khronos.org/registry/typedarray/specs/latest/). –

+0

đúng vậy - điều đó chắc chắn sẽ hữu ích :-) – Pointy

Trả lời

9

Hãy xem this Stack Overflow question, câu trả lời có chứa tham chiếu đến nhiều công cụ nén được triển khai trong javascript. Hầu hết chúng được dựa trên LZ77.

-4

Đừng làm điều đó trong JavaScript. Nó sẽ được làm chậm và bên cạnh đó JS không làm tốt với dữ liệu nhị phân.

Chỉ cần sử dụng mã hóa chuyển gzip ở phía máy chủ và trình duyệt của bạn sẽ xử lý việc giải nén mã đó.

+11

Tôi không hỏi liệu nó tốt hay xấu. Tôi đang tìm cách triển khai. -1. –

+4

Lời khuyên rất hay, @Ondra. Nếu bạn muốn làm điều gì đó được coi là "ý tưởng tồi" của nhiều người có chuyên môn, bạn nên giải thích lý do của mình. – Pointy

+3

@Pointy: Tôi không đồng ý. Tất nhiên bạn là đúng, nhưng nếu ai đó đang yêu cầu một cái gì đó không chính thống nó có lẽ không phải là điều tốt nhất để chỉ vẫy một ngón tay wagging, bất kể chuyên môn. – jAndy

9

Tôi không biết làm thế nào bạn muốn mà, nhưng tôi thích những hiện thực:

Đầu tiên là nhanh nhất so với thứ hai, chúng ta thường có thể đảm bảo một máy chủ nhanh chóng, tuy nhiên chúng tôi không biết hiệu suất của máy khách. Vì vậy, tôi khuyên bạn nên chọn js-deflate và điều chỉnh java (phía máy chủ) của bạn để thổi phồng.

https://github.com/dankogai/js-deflate

http://code.google.com/p/gzipjs/

+3

Url thứ hai (gzipjs) không có bất kỳ mã nào được đăng ở bất kỳ đâu ... hoặc tôi có thiếu gì đó không? –

+1

Đây phải là các câu trả lời được chấp nhận. – almosnow

+0

Tôi đã tìm kiếm xung quanh trong nhiều giờ, tôi bỏ qua câu trả lời này lần đầu tiên, nhưng nó thực sự là rất đơn giản, và giải pháp tuyệt vời. Tôi đã được điểm chuẩn nó chống lại LZMA và nó là đến 10x nhanh hơn, và với nén tương đương! –

2

Ví dụ này: http://cheeso.members.winisp.net/srcview.aspx?dir=js-unzip cho thấy làm thế nào bạn có thể làm file ZIP trong Javascript. Bây giờ, tôi biết bạn muốn nén ZLIB hoặc DEFLATE, thay vì ZIP. Tuy nhiên, ZIP sử dụng DEFLATE và trong tệp .js cho ví dụ đó, có một lớp InflatingReader có thể INFLATE khi nó đọc.

Lớp lộ những phương pháp:

readByte() 
    returns null when EOF is reached, or the value of the byte when successful. 

readToEnd() 
    returns an array of all bytes read, to EOF 

beginReadToEnd(callback) 
    async version of the above 

readBytes(n) 
    returns an array of n bytes read from the source. 

beginReadBytes(n, callback) 
    async version of the above 

Bạn có thể sử dụng mã không thay đổi nếu bạn muốn INFLATE.

Nếu bạn muốn ZLIB (còn gọi là giải nén), thì có chữ ký 2 byte mà bạn cần đọc và xác thực trước khi đọc các byte đã nén và thực hiện INFLATE. Chỉ cần sửa đổi các InflatingReader để đọc và đổ 2 byte, và nó sẽ làm ZLIB tốt.

+0

Liên kết đầu tiên không còn trực tuyến nữa. – heinob

+0

vâng, xin lỗi, tôi biết. Tôi sẽ làm việc để đưa nó vào một nơi mới. – Cheeso

2

Tôi tìm thấy một thổi phồng thực hiện làm việc ở đây:

http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt

Nếu bạn muốn có một phiên bản hơi sạch hơn mà không gian tên các thuật toán, chương trình này nên làm việc:

https://github.com/augustl/js-inflate

Hãy ghi nhớ dữ liệu "thổi phồng" được thêm tiền tố với tiêu đề hai byte và được gắn với một tổng kiểm tra bốn byte, mà bạn sẽ cần phải tách trước khi chuyển đến thuật toán.

3

có thư viện vẽ đồ thị này là một phần của thư viện, một triển khai zlib trong javascript. nếu bạn cuộn xuống trang này một chút, bạn sẽ thấy nó dưới dạng tải xuống riêng biệt. http://jsxgraph.uni-bayreuth.de/wp/download/