Sử dụng cơ sở 80 để nén tệp


8

Tôi muốn nén kích thước tệp thông qua việc tạo hệ thống đánh số của riêng tôi là số dựa trên 80, tôi thực sự muốn biết liệu điều này có khả thi không? Tôi đã học được rằng Hexadecimal sử dụng các ký hiệu như A, B, C, D, E, F để thể hiện 10,11,12,13,14,15 - và đó là những gì tôi muốn làm với hệ thống đánh số của riêng mình nhưng ở quy mô lớn hơn . Xin hãy sửa tôi nếu tôi thiếu thứ gì đó.

Có thể không?


2
Xem thêm tại đây .
Raphael

5
Câu trả lời của Frank giải thích tại sao điều này không hoạt động. Nhưng đây là điều bạn có thể tự hỏi mình trước khi bắt đầu: bạn nghĩ bạn đang sử dụng tài sản đặc biệt nào của số 80? Trừ khi có điều gì đó đặc biệt về 80, nếu ý tưởng của bạn hoạt động cho 80, liệu nó có hiệu quả hơn với 81 không? Hay 801?
David Richerby

3
@DavidR Richby: Tôi không thể nghĩ nhiều về giá trị cho cơ sở 80, nhưng thực sự có một số giá trị thực sự khi sử dụng cơ sở-85: nó có thể chuyển đổi các nhóm bốn octet thành năm ký tự có thể in được. Mặc dù hiệu quả lưu trữ không phải là một cải tiến lớn so với cơ sở 64 (hai mươi ký tự sẽ đại diện cho mười lăm octet trong cơ sở 64 và mười sáu trong cơ sở 85), thực tế là "chunk" dữ liệu cơ bản là 32 bit thay vì 24 bit rất hữu ích
supercat

Ý tôi là nếu tôi có thể tìm thấy một số mẫu và thể hiện chúng trong các biểu tượng thì sao?
Kinani

2
Nếu bạn tìm thấy các mẫu và biểu diễn chúng trong các ký hiệu, bạn đã tạo ra một thuật toán nén hoạt động (miễn là bản trình bày ngắn hơn mẫu gốc). Đây là cách tất cả các thuật toán nén hoạt động.
Tanner Swett

Câu trả lời:


30

Mặc dù bạn sẽ cần ít hơn các số dựa trên 80 so với số 2 bit (bit) để mã hóa cùng một tệp, cách duy nhất để lưu trữ các số dựa trên 80 này trên máy tính là mã hóa chúng dưới dạng bit. Vì vậy, bạn không đạt được bất cứ điều gì.

Trong thực tế, bạn thực sự mất không gian, vì 80 không phải là lũy thừa 2: Bạn sẽ cần 7 bit cho mỗi số dựa trên 80, nhưng trong 7 bit này, bạn có thể mã hóa 128 trạng thái khác nhau, nếu bạn sử dụng chúng trực tiếp.


10

Có một số cách để giải thích câu hỏi. Điều tôi nghĩ bạn có thể hỏi là bạn có một chuỗi chữ cái trong bảng chữ cái Σ trong đó | Σ | = =nΣ|Σ|= =80

nđăng nhập2|Σ|Ôi(đăng nhậpn) các bit của không gian trung gian. (Hãy nhớ rằng, đó là logarit của số lượng ký hiệu, tính bằng bit! Nếu kích thước của chuỗi phù hợp với một từ máy, thì bộ nhớ trung gian được yêu cầu nhiều nhất là một số lượng từ máy.)

Vì vậy, đó là khá tốt. Nhưng những gì về nếu chúng ta muốn truy cập ngẫu nhiên?

nđăng nhập2|Σ|Ôi(1) thời gian . Nếu bạn nghĩ về nó, đây là một kết quả đáng chú ý, bởi vì nó có nghĩa là một máy tính hoạt động với bất kỳ cơ số nào, theo một nghĩa nào đó, tương đương với một hệ nhị phân.

Đây là bài báo: Yevgeniy Dodis, Mihai Pătraşcu và Mikkel Thorup, Giải pháp thay thế cho mã hóa số học với khả năng giải mã cục bộ , STOC 2010.

Nhân tiện, hãy nhớ tên Mihai Pătraşcu. Ông đã và là điều gần gũi nhất với chúng ta đối với một Évariste Galois thời hiện đại. Ông chết rất trẻ, vì một khối u não ở tuổi 29. Nhưng trong sự nghiệp ngắn ngủi của mình là một nhà khoa học máy tính, công việc của ông đã cách mạng hóa lĩnh vực phân tích các thuật toán theo cách mà phải mất hàng thập kỷ để hiểu đầy đủ.


3

Nếu bạn có một số (ví dụ: 123456789⏨) dưới dạng văn bản, bạn có thể viết nó trong một cơ sở khác (chẳng hạn như 21i3v9 trong cơ sở 36), vì vậy bạn nénthành văn bản (từ 9 ký tự thành 6).

Nếu bạn đi xa hơn, cuối cùng bạn sẽ lưu trữ nó ở dạng nhị phân (4 byte¹).

Bây giờ, điều này hoạt động vì bạn đã bắt đầu với một bộ giảm [0-9] và chuyển sang một bộ lớn hơn [0-9a-z] nhiều bit dữ liệu không được sử dụng trong biểu diễn ban đầu.

Tương tự, nếu chúng ta biết rằng một tệp chỉ chứa các chữ cái, chúng ta có thể dễ dàng nén nó bằng cách thay đổi cơ sở. Tuy nhiên, nếu bạn nén từ nội dung tùy ý, điều đó sẽ không (luôn luôn) hoạt động. Bạn có thể nén (nhận đầu ra nhỏ hơn) cho một số tệp, nhưng các tệp khác sẽ trở nên lớn hơn giống như bất kỳ phương pháp nén không mất dữ liệu nào , điều này là không thể tránh khỏi.

Tuy nhiên, nó vẫn có thể hữu ích, một phương pháp nén văn bản tiếng Anh tốt nhưng làm cho văn bản tiếng Trung lớn hơn có thể đủ tốt nếu bạn viết nhiều tiếng Anh hơn tiếng Trung Quốc.

Trên thực tế, bạn chỉ cần 2²⁷ bit, mặc dù hiện nay bộ nhớ máy tính sử dụng bội số của 8 bit (nhưng có lẽ bạn muốn lưu trữ một chuỗi các số 2²⁷ bit? ☺).


2

Cơ sở 80 ?? Tại sao 80? Nó không có ý nghĩa, tuy nhiên cơ sở 85 thì có. Điều này khá thuận tiện khi bạn có thể biểu thị 4 byte bằng 5 ký tự (vì 85 ^ 5 = 4,437,053,125, hơi nhiều hơn 2 ^ 32 = 4,294,967,296)

Đây là mã của tôi để viết một 32-bit duy nhất word:

for (i=0; i<5; i++)
{
    c = (word % 85) + 37;
    word /= 85;
    fwrite(&c, sizeof(uint8_t), 1, file);
}

và đây là để đọc lại:

    word = 0;
    for (i=4; i>=0; i--)
        fread(&c[i], sizeof(uint8_t), 1, file);

    for (i=0; i<5; i++)
        word = word*85 + c[i]-37;

Nếu bạn thực sự muốn sử dụng cơ sở 80, bạn có thể sử dụng cùng một cách tiếp cận và thay thế các thể hiện của 85 bằng 80 và bạn sẽ cần 6 ký tự cho mỗi 4 byte thay vì 5.

Làm thế nào nó sẽ nén bất cứ điều gì mặc dù? Bạn có nhận ra rằng các tập tin được viết trong cơ sở 256, phải không? Điều này được nói rằng nếu bạn nén một tệp được viết trong cơ sở 85 thì nó sẽ có cùng kích thước với tệp cơ sở 256 đã được nén, làm cho cơ sở 85 (hoặc cơ sở 64) trở thành một lựa chọn tốt nếu bạn muốn biểu thị dữ liệu nhị phân bằng các ký tự có thể in được.



0

Các cơ sở khác nhau được sử dụng cho các mục đích khác nhau, mặc dù như các câu trả lời khác giải thích bạn sẽ không đạt được bất cứ điều gì về mặt nén.

Xem wikipedia để được giải thích về mã hóa base64 . Base 64 thường được sử dụng, không phải để nén, nhưng để mã hóa dữ liệu nhị phân thường dẫn đến các ký tự không thể in và mã điều khiển thành không gian ký tự ASCII có thể in được. Điều này sẽ dẫn đến kích thước tệp lớn hơn , nhưng rất hữu ích để truyền dữ liệu nhị phân có thể được nhúng trong các tệp ASCII khác, ví dụ: bên trong XML, email, CSS, trang web, v.v.


Những gì bạn nói là đúng nhưng nó không trả lời câu hỏi.
David Richerby

@DavidR Richby Tôi không đồng ý. Nó trả lời câu hỏi từ điểm có thể sử dụng các cơ sở số khác với các cơ sở mà OP quen thuộc và chúng có mục đích, nhưng mục đích đó không phải là nén.
Luke Mills

Câu hỏi là, có thể nén các tệp bằng cách ghi chúng vào cơ sở 80 không? Câu trả lời là "không", như bạn đã đề cập trong câu đầu tiên và như tất cả các câu trả lời khác đã bao gồm. Đoạn thứ hai của bạn là một nhận xét về câu hỏi. Bình luận đi trong bình luận.
David Richerby
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.