File zip là gì? Một file được nén như thế nào?

File zip là gì? Một file zip được nén như thế nào? Có lẽ bạn hiểu được ý tưởng cơ bản, rằng file được nén lại để tiết kiệm bộ nhớ, nhưng làm thế nào mà dữ liệu trong thư mục của tôi lại trở nên nhẹ hơn? Chỗ dữ liệu “thừa” hay không được nén bay đi đâu mất rồi?

File zip là gì? Một file được nén như thế nào?

File zip là gì? Một file được nén như thế nào?

File zip là gì?

File zip là gì?

Hãy thử nghĩ về các thư mục trong Windows. Bạn đặt file (và các thư mục con) vào trong một thư mục nhằm sắp xếp chúng theo ý mình. Bạn có thể copy, di chuyển thư mục này ra các vị trí khác bên trong máy vi tính. Các file bên trong thư mục này cũng sẽ được di chuyển khi bạn ra lệnh di chuyển thư mục.

File zip cũng gần giống như thư mục vậy. Điểm khác biệt duy nhất là khi bạn nén file, dung lượng lưu trữ sẽ được giảm xuống.

File zip có thể hoạt động tiện lợi hơn thư mục trong một số trường hợp. Ví dụ, bạn cần gửi một thư mục có khoảng 30 file cỡ nhỏ qua email. Bạn sẽ không thể đính kèm 30 file này vào email, do phần lớn các dịch vụ email đều giới hạn 25 file đính kèm. Chưa kể, việc tải về quá nhiều file đính kèm qua email sẽ gây bất tiện cho người nhận.

Trong trường hợp bạn cần giữ nguyên cấu trúc của thư mục được gửi, bạn cũng không thể đính kèm một thư mục vào email được.

Thay vào đó, bạn có thể nén (zip) các file này lại một file duy nhất và gửi qua email. Việc giải nén 30 file (giữ được cấu trúc thư mục) sẽ dễ dàng và tiện lợi hơn nhiều so với việc nhận từng file riêng lẻ. Ngoài ra, nén file cũng sẽ giúp giảm dung lượng cần gửi, giúp bạn tiết kiệm băng thông.

Như vậy, lợi ích của file zip là rất rõ ràng, và gần như bất kì ai cũng có thể kể ra các lợi ích nói trên. Tuy vậy, nén file còn rất nhiều lợi ích khác mà bạn có thể chưa biết tới.

File zip là gì? Một file được nén như thế nào?

Một file được nén như thế nào?

Một file được nén như thế nào?

Giả sử như bây giờ bạn có một file chứa chuỗi “aaaaaaaaaaaaaaaaaaaa” (không bao gồm dấu nháy kép nha), tức là dữ liệu gồm 20 kí tự (hoặc 20 bytes nếu sử dụng chuẩn mã hóa ASCII).

Nếu bạn biết rằng các file dạng này hiếm khi chứa thứ gì khác ngoài kí tự, bạn có thể thay thế chuỗi trên bằng “20a” và lập trình cho phần mềm đọc file là lệnh này có nghĩa là tạo ra một chuỗi có 20 kí tự a.

Nhưng đối với file có chứa số thì cách làm này có hoạt động không? Và lúc đấy thì bạn có thể cho thêm vào một quy tắc là, nếu một số cần được giữ nguyên, dịch theo đúng nghĩa đen thì bạn đặt một kí hiệu phía trước nó chẳng hạn (ở đây tôi dùng dấu gạch chéo ngược \).

Trong một số trường hợp nhất định mà file không chứa quá nhiều chữ số và dấu \, kích thước của file có thể được giảm đi theo cách này. Nhưng trong một số trường hợp đặc biệt thì kích cỡ của file lại tăng lên do chính quy tắc trên khi mà bạn muốn biểu diễn các số và dấu \.

Tiếp đến là một công cụ nén mà nó thay thế một đoạn dữ liệu xuất hiện nhiều lần bằng một kí hiệu ngắn hơn. Ví dụ bạn có một đoạn văn bản trong đó có một số từ xuất hiện khá nhiều lần, phần mềm nén có thể thay thế từ đó chỉ bằng một kí tự hay kí hiệu mà thôi. Và để cho phần mềm giải nén biết được cách giải nén, phần mềm nén sẽ viết vào đầu file một danh sách các từ “viết tắt” này, theo sau bởi kí tự hoặc kí hiệu đã được thay thế trong file.

Một ví dụ thực tế này. Bây giờ chúng ta sử dụng cả hai cách mà Mẹo Hay Today vừa nói trên đây (cách thay thế các kí tự lặp lại liên tiếp bằng một số và cách “viết tắt” đi kèm với “từ điển viết tắt” được đặt ở đầu file). Ta gọi cú pháp để định nghĩa từ viết tắt trong “từ điển” là “X=word”, nghĩa là thay thế “word” bằng “X” khi nén và ngược lại khi giải nén, và văn bản được đánh dấu bắt đầu bằng dấu chấm than “!”. Chúng ta cũng sử dụng dấu gạch chéo ngược để nhắc rằng kí tự phía sau nó được dịch theo nghĩa đen, tức không cần chuyển đổi gì cả.

Đoạn văn bản là:

  • I’m going to write Facebook 5 times (FacebookFacebookFacebookFacebookFacebook) and post it on Facebook.

Đoạn này có 103 kí tự. Áp dụng cách nén trên kia thì ta có:

  • $=Facebook!I’m going to write $ \5 times (5$) and post it on $.
File zip là gì? Một file được nén như thế nào?

File zip là gì? Một file được nén như thế nào?

Đoạn này lại chỉ có 63 kí tự thôi, tức giảm được một phần ba. Thuật toán nén ta vừa dùng vẫn còn rất đơn sơ và nó vẫn có thể được phát triển thêm.

Một kĩ thuật khác nữa là giảm kích cỡ của bảng chữ cái. Trong chuẩn mã hóa ASCII, mỗi kí tự sử dụng 1 byte trong bộ nhớ, nhưng mà với 1 byte thì bạn có thể biểu diễn 256 kí tự khác nhau. Nếu bạn biết rằng trong file của bạn chỉ chứa các kí tự in thường thì bạn chỉ cần đến 26 kí tự khác nhau thôi, 26 kí tự này có thể được biểu diễn chỉ với 5 bits. Với kí tự đầu tiên, bạn dùng 5 trên 8 bits của byte thứ nhất, kí tự thứ hai bạn dùng 3 bits còn lại và 2 bits của byte thứ hai rồi cứ tiếp diễn như vậy (1 byte = 8 bits).

Giờ thì file này chỉ được giải nén đúng nếu phần mềm giải nén biết được rằng nó đang phải xử lí một file mà các kí tự in thường được mã hóa chỉ trong 5 bits. Điều này thì gần như là không thay đổi được. Nên bạn có thể giải quyết bằng cách thêm vào đầu file một đoạn dữ liệu chứa cách mã hóa được sử dụng, trong ví dụ này nó sẽ nói rằng mỗi kí tự sử dụng 5 bits và danh sách các kí tự được dùng đến. Đoạn mã này tất nhiên là chiếm mất một khoảng bộ nhớ, nên giảm đi tính hiệu quả của việc nén, nhưng ngược lại nó lại cho phép phần mềm nén sử dụng một tập hợp bất kì các kí tự mà nó muốn, và do đó áp dụng được đối với bất kì file nào.

Trong thực tế, ZIP và các kĩ thuật nén file khác phức tạp hơn nhiều so với ví dụ trên đây. Nhưng mà về cơ bản thì ý tưởng là giống nhau: Nén file là cách lưu trữ dữ liệu hiệu quả hơn bằng cách sử dụng một vài dạng rút gọn, viết tắt hoặc dùng kí hiệu như khi ta tốc kí. Các cách viết tắt, rút gọn này là một phần trong tiêu chuẩn chính thức của hệ thống nén, dựa vào đó các nhà phát triển có thể nén và giải nén một cách chính xác để có thể tạo lại được dữ liệu ban đầu.

Cũng như trong ví dụ của bạn, việc nén file hoạt động trên một số file tốt hơn là trên số khác. Một file văn bản có nhiều từ lặp lại nhiều lần thì sau khi nén kích cỡ được giảm đi đáng kể, và một file khác chỉ có các từ dường như ngẫu nhiên, không lặp lại thì việc nén file này không hữu dụng mấy.

Và một điều cuối cùng, tất cả những gì từ đầu đến giờ đều thuộc một loại, là nén không mất dữ liệu. Dễ hiểu thôi, sau các quá trình nén và giải nén thì không một thông tin nào bị rơi mất cả. Nếu bạn nén và giải nén một file bằng giải thuật không mất dữ liệu thì hai files lúc đầu và lúc sau giống nhau hoàn toàn đến từng bit.

Còn loại nén khác là nén có mất dữ liệu. Trong khi nén không mất dữ liệu tìm cách lưu trữ tốt hơn, thì nén có mất dữ liệu lại được dùng để loại bỏ đi một số dữ liệu mà không làm ảnh hưởng tới mục đích sử dụng của file. Chẳng đâu xa, nhiều định dạng ảnh, âm thanh và video có sử dụng cách nén có mất dữ liệu.

Đối với ảnh, định dạng JPEG tìm cách loại bỏ đi những chi tiết nhỏ mà người thường khó nhận biết được. Ví dụ nhé, nếu hai pixel ở cạnh nhau có màu gần như giống nhau, chúng ta có thể đặt luôn cho cả 2 cùng một màu. Hầu hết các định dạng sử dụng kiểu nén có mất dữ liệu cho phép người dùng điều chỉnh mức độ nén, giống như khi chúng ta lưu file JPEG thì có chỗ chọn “chất lượng hình ảnh” ấy.

Mức độ nén càng cao thì kích cỡ file càng nhỏ lại, nhưng mà đổi lại thì nhiều dữ liệu bị loại bỏ hơn và do đó chất lượng hình ảnh thấp hơn. Đến một mức nào đấy thì chúng ta có thể nhận biết được rõ rệt sự sai khác so với hình ảnh ban đầu. Khái niệm “JPEG giả tạo” dùng để chỉ các hình ảnh có chất lượng bị giảm đi rất nhiều vì bị nén (có mất dữ liệu) nhiều lần (hoặc việc lặp lại ứng dụng chỉnh sửa ảnh, chất lượng ảnh JPEG bị giảm đi mỗi lần nó được lưu lại).

Giải nén file thế nào?

Hiện nay, việc giải nén 1 file nào đó đã trở nên dễ dàng hơn rất nhiều với các công cụ có sẵn như Winzip, Winrar, 7Zip,… nhờ đó bạn sẽ không còn gặp khó khăn trong việc nén hoặc giải nén bất cứ một file với kích thước nào,

Xem thêm:

Reply