2012-07-16 9 views
7

Tôi đang suy nghĩ về việc ghi một số dữ liệu vào luồng bit bằng cách sử dụng C. Có hai cách để ý. Một là ghép các ký hiệu độ dài bit biến thành một chuỗi bit liền nhau, nhưng theo cách này, bộ giải mã của tôi có thể sẽ khó tách các biểu tượng đó khỏi luồng bit liên tục này. Một cách khác là phân phối cùng một lượng bit cho biểu tượng và theo cách đó, bộ giải mã có thể dễ dàng khôi phục dữ liệu ban đầu, nhưng có thể có sự lãng phí bit vì các biểu tượng có các giá trị khác nhau. không (các bit chất thải này tôi đoán).Cách viết một bitstream

Bất kỳ gợi ý nào tôi nên làm?

Tôi là người mới lập trình. Bất kỳ trợ giúp sẽ được đánh giá cao.

+0

Đây là câu trả lời tương tự của tôi câu hỏi ở đây: http: // stac koverflow.com/questions/11253123/how-can-i-print-a-bit-instead-of-byte-in-a-file/11253310#11253310 –

+0

Cách thông thường là đóng gói các bit, nhưng yêu cầu logic biết số bit ở phía bên kia. Bạn có thể sẽ giải mã từng chút một để biết khi nào bạn đã đến cuối biểu tượng. –

+1

Câu hỏi của bạn liên quan đến lĩnh vực mã hóa. Huffman mã hóa, như đã đề cập dưới đây, là một lựa chọn. Nhưng có những người khác như Huffman mã hóa không phải là người duy nhất (nhưng nó chắc chắn là phổ biến nhất). Xem cuốn sách "Thuật toán nén và mã hóa" của Moffat và Turpin. Hầu hết các cuốn sách nén đều có thứ gì đó về viết mã; cuốn sách này tập trung vào viết mã. Trong điều khoản của "thời gian khó tách", bạn cần một mã mà là tiền tố miễn phí - không có mã là tiền tố của bất kỳ khác. – Ray

Trả lời

2

Có vẻ như bạn đang cố gắng làm điều gì đó tương tự như một chương trình nén Huffman? Tôi sẽ chỉ đi byte-by-byte (char) và theo dõi các bù đắp trong byte mà tôi đọc tắt biểu tượng cuối cùng.

Giả sử không có biểu tượng nào của bạn lớn hơn char. Nó sẽ giống như thế này:

struct bitstream { 
    char *data; 
    int data_size;   // size of 'data' array 
    int last_bit_offset;  // last bit in the stream 

    int current_data_offset; // position in 'data', i.e. data[current_data_offset] is current reading/writing byte 
    int current_bit_offset; // which bit we are currently reading/writing 
} 

char decodeNextSymbol(bitstream *bs) { 

} 

int encodeNextSymbol(bitstream *bs, char symbol) { 

} 

Mã phù hợp cho decodeNextSymbol và encodeNextSymbol sẽ phải sử dụng các thao tác C Bitwise ('&' (bitwise AND), và '|' (bitwise OR) ví dụ tôi. sau đó sẽ đưa ra một danh sách tất cả các ký hiệu của tôi, bắt đầu bằng các ký hiệu ngắn nhất đầu tiên và thực hiện một vòng lặp trong khi khớp với biểu tượng ngắn nhất. Ví dụ: nếu một trong các biểu tượng của bạn là '101', thì nếu luồng là '1011101' , nó sẽ khớp với '101' đầu tiên và sẽ tiếp tục khớp với phần còn lại của luồng '1101' Bạn cũng sẽ phải xử lý trường hợp giá trị biểu tượng của bạn tràn từ một byte sang byte tiếp theo.