26 thg 10, 2010

thư viện thao tácBit

Bit thao tác thư viện

source: http://michael.dipperstein.com/bitlibs/ 


For some reason I keep finding myself dabbling in the worlds of compression and encryption. Đối với một số lý do tôi tiếp tục mò tìm kiếm bản thân mình trong thế giới của nén và mã hóa. I'm not an expert in either of these areas, nor do I aspire to become one. Anh không phải là chuyên gia về một trong những khu vực này, cũng không làm tôi mong muốn trở thành một. It's just something that catches my interest from time to time. Nó chỉ là một cái gì đó mà bắt quan tâm của tôi từ thời gian.
On computers, both compression and encryption usually take bit patterns with a given meaning and translate them to other patterns intended to have the same meaning. Trên máy tính, cả hai nén và mã hóa thường có các mẫu bit với một ý nghĩa nhất định và chuyển chúng vào các mẫu khác nhằm mục đích có cùng một nghĩa. This typically means having to read, write, and manipulate arbitrary groups of bits. Điều này thường có nghĩa là có thể đọc, viết, và thao tác các nhóm tùy ý của các bit. To save myself from reinventing the wheel every time I played with another compression or encryption algorithm, I developed two libraries: one for bitwise file reading and writing ( bitfile ), and the other for manipulating arbitrary length arrays of bits ( bitarray ). Để lưu bản thân mình từ tái phát minh bánh xe mỗi khi tôi chơi với nhau hoặc mã hóa thuật toán nén, tôi đã phát triển hai thư viện: một cho phép toán tập đọc và viết ( bitfile ), và một cho thao tác mảng độ dài tùy ý của các bit ( bitarray ).
Some time ago I was asked to modify my LZSS implementation so it could be used on a SEGA Genesis without a file system, so I developed a bitwise array reading and writing library (arraystream). Một số thời gian trước, tôi đã được yêu cầu sửa đổi của tôi LZSS thực hiện để nó có thể được sử dụng trên một Genesis SEGA mà không có một hệ thống tập tin, vì vậy tôi đã phát triển một mảng trên bit đọc và viết thư viện (arraystream). Arraystream is very similar to bitfile, with the major exception being that it operates on arrays. Arraystream rất giống với bitfile, ngoại trừ chủ yếu là do nó hoạt động trên mảng.
I originally wrote the bitfile and bitarray libraries in ANSI C, because I used C for my compression algorithms. Tôi ban đầu được viết và bitarray thư viện bitfile trong ANSI C, bởi vì tôi đã sử dụng C cho các thuật toán nén của tôi. However, these libraries were one of just a few things that I ever wrote (I've written a lot) where I thought that I could do a better job with C++. Tuy nhiên, các thư viện này là một trong những chỉ là một vài điều mà tôi đã từng viết (tôi đã viết rất nhiều), nơi tôi nghĩ rằng tôi có thể làm một công việc tốt hơn với C + +. So I developed C++ implementations of my bitfile and bitarray libraries. For the time being, the arraystream library is exclusively available in C. Vì vậy, tôi đã phát triển C + + hiện thực của bitfile của tôi và các thư viện bitarray được. Đối với thời gian, thư viện arraystream là độc quyền có sẵn trong C.
Recently (since 2008 or so) I've been using Python when I've needed quick hacks to do something on a PC (vs an embedded system). Gần đây (từ năm 2008, hay như vậy) Tôi đã sử dụng Python khi tôi cần hacks nhanh chóng để làm điều gì đó trên máy tính (vs một hệ thống nhúng). After doing some searching of PYPI , the Python Package Index, I noticed there were a number of Python packages that were similar to my bitarray library, but there wasn't anything that provided all the functionality of my bitfile library. Sau khi thực hiện một số tìm kiếm của PYPI , các gói Python Index, tôi nhận thấy có một số gói Python tương tự với thư viện bitarray của tôi, nhưng đó không phải là bất cứ điều gì mà cung cấp tất cả các chức năng của thư viện bitfile của tôi. I had to fix that problem by providing a pure Python version of my bitfile library too. Tôi đã phải sửa chữa vấn đề bằng cách cung cấp một phiên bản Python tinh khiết của thư viện bitfile của tôi quá.
I am publishing all of these libraries under the GNU LGPL in hopes that they will be of use to other people. Tôi xuất bản tất cả các thư viện theo GNU LGPL hy vọng rằng họ sẽ được sử dụng cho người khác.
The rest of this page discusses each of my libraries. Phần còn lại của trang này thảo luận về mỗi của các thư viện của tôi.
Michael Dipperstein Michael Dipperstein
mdipper@alumni.engr.ucsb.edu mdipper@alumni.engr.ucsb.edu

Bitfile Libraries Thư viện Bitfile

Implementation Thực hiện

Each version of the bitfile library provides a wrapper around the language's native file I/O. Mỗi phiên bản của thư viện bitfile cung cấp một bao bọc xung quanh tập tin ngôn ngữ bản xứ I / O. The ANSI C version uses file I/O functions and every bitfile is referenced by a structure which includes a FILE pointer. Các ANSI C phiên bản sử dụng tập tin I / O và các chức năng bitfile hàng được tham chiếu bởi một cấu trúc bao gồm một FILE con trỏ.
The arraystream library uses a similar structure, replacing the FILE pointer with a pointer to an array of unsigned characters and an array index. Các thư viện arraystream sử dụng một cấu trúc tương tự, thay thế các FILE con trỏ với một con trỏ tới một mảng các ký tự không dấu và mảng chỉ số. Arraystream operations are analogous to bitfile operations in almost all respects and will not be discussed further. Arraystream hoạt động là tương tự như bitfile hoạt động ở hầu hết các tôn trọng và sẽ không được thảo luận thêm.
The C++ version of the bitfile library makes use of (but does not inherit from) the ifstream and ofstream classes. Every bit file object contains an ifstream pointer and ofstream pointer. Các C + + phiên bản của thư viện bitfile này sử dụng (nhưng không được thừa hưởng từ) các ifstreamofstream lớp chứa. file bit Mỗi một đối tượng ifstream con trỏ và ofstream con trỏ.
The Python version implements a class containing a Python file object. Các phiên bản Python thực hiện một lớp có chứa một đối tượng file Python.
In addition to a reference to a native file, each library includes an 8-bit buffer, and counter responsible for tracking the number of bits in the 8-bit buffer. Ngoài một tham chiếu đến một tập tin gốc, mỗi thư viện bao gồm một-bit đệm 8, và truy cập chịu trách nhiệm theo dõi số lượng các bit trong bộ đệm 8-bit. The C and C++ versions of the bitfile library use an unsinged char for the 8-bit buffer. C và C + + phiên bản của thư viện bitfile sử dụng một unsinged char -bit cho bộ đệm 8.

Reading Bits Đọc Bits

Reading bits from a bitfile works as follows: Đọc bit từ bitfile một công trình như sau:
Step 1. Read a byte from the underlying file and store it in the 8-bit buffer. Bước 1. Đọc một byte từ tập tin cơ bản và lưu nó trong bộ đệm 8-bit.
Step 2. Set the count of bits in the buffer to 8. Bước 2 8. Đặt tính của các bit trong bộ đệm để.
Step 3. Report the least significant bit (lsb) in the buffer as the bit read. Bước 3. Báo cáo quan trọng nhất là bit (LSB) trong bộ đệm là bit đọc.
Step 4. Shift the buffer right by one bit. Bước 4 bit. Shift đệm quyền một.
Step 5. Decrement the count of bits in the buffer. Bước 5 đệm. Lượng giảm số lượng các bit trong.
To read an additional bit, repeat the process from Step 3 . Để đọc một bit bổ sung, lặp lại quá trình từ bước 3. Once all bits are read from the 8-bit buffer (the count equals 0) the process starts over from Step 1 . Một khi tất cả các bit được đọc từ các-bit đệm 8 (đếm bằng 0) bắt đầu quá trình trên từ bước 1.

Writing Bits Viết Bits

Writing bits to a bitfile works as follows: Viết bit để bitfile một công trình như sau:
Step 1. Left shift the 8-bit buffer by one bit. Bước 1. Lại chuyển các-bit đệm 8 bởi một chút.
Step 2. Set the least significant bit (lsb) of the 8-bit buffer to the value of the bit being written. Bước 2 bit. Thiết lập quan trọng nhất là bit (LSB) của 8-bit bộ đệm để các giá trị được viết.
Step 3. Increment the count of bits in the 8-bit buffer. Bước 3 đệm. Tăng số lượng các bit trong 8-bit.
Repeat the process from Step 1 for each additional bit. Once 8 bits have been written to the 8-bit buffer, the buffer is written to the underlying file and the bit count is set to 0. Lặp lại quá trình từ bước 1 cho mỗi bit bổ sung. Khi 8 bit đã được ghi vào bộ đệm 8-bit, bộ nhớ đệm được viết vào tập tin cơ sở và số lượng bit được thiết lập là 0.
I have incorporated some short cuts that bypass the 8-bit buffer in the functions that read/write characters or bytes. Tôi đã tập hợp một số vết cắt ngắn mà bỏ qua các-bit đệm 8 trong các chức năng đọc / ghi các ký tự hay byte.

Usage Cách sử dụng

Rather than writing lengthy man pages for each of the functions in the bitfile library, I have taken a cheap cop-out. Thay vì viết các trang người đàn ông dài cho từng chức năng trong thư viện bitfile, tôi đã thực hiện một cảnh sát giá rẻ-out. The bitfile source includes detailed headers preceding each function. Các nguồn bitfile bao gồm tiêu đề chi tiết trước mỗi chức năng. The Python version of the bitfile library includes comments in docstring format. Các phiên bản Python của thư viện bitfile những ý kiến trong docstring định dạng.
I have also included a file named sample.[c|cpp|py] which demonstrates the usage of each function in the bitfile library and serves as a test to verify the correctness of the code. Tôi cũng bao gồm một tên file mẫu]. [C | cpp | py đó chứng tỏ việc sử dụng của từng chức năng trong thư viện bitfile và phục vụ như một thử nghiệm để xác minh tính đúng đắn của mã này.

Download Tải về

An archive containing the source for each bitfile library may be downloaded by clicking on the links below. Một kho lưu trữ có chứa các mã nguồn cho mỗi thư viện bitfile có thể được tải về bằng cách nhấp vào liên kết bên dưới. My source has been released under the GNU LGPL . nguồn của tôi đã được phát hành theo GNU LGPL .
Language Ngôn ngữ Archive Lưu Trữ
ANSI C ANSI C bitfile-0.8.zip , arraystream-0.2.zip bitfile-0.8.zip , arraystream-0.2.zip
ISO C++ ISO C + + bitfile_cpp-0.8.zip bitfile_cpp-0.8.zip
Python Python bitfile-0.2.tar.gz bitfile-0.2.tar.gz

Bitarray Library Thư viện Bitarray

Implementation Thực hiện

The ANSI C bitarray library provides a collection of functions that create and operate on arrays of bits. Các ANSI C bitarray thư viện cung cấp một tập hợp các chức năng mà tạo ra và hoạt động trên các mảng của các bit. The ISO C++ bitarray library provides a class with methods that perform similar functions. ISO C + + bitarray thư viện cung cấp một lớp học với các phương pháp thực hiện các chức năng tương tự.
Bitarrays may be of any size and are implemented as arrays of unsigned char . Bitarrays có thể có kích thước bất kỳ và được thực hiện như các mảng của unsigned char . Bit 0 of the most significant unsigned char (char 0) is the most significant bit (msb) of the bit array. Bit 0 của quan trọng nhất unsigned char (char 0) là bit quan trọng nhất (MSB) của mảng bit. The last (non-spare) bit of the last unsigned char is the least significant bit (lsb). The) cuối cùng (không phụ chút cuối cùng unsigned char là bit quan trọng nhất (LSB).
Example: Ví dụ:
An array of 20 bits (0 through 19) with 8 bit unsigned char s requires 3 unsigned char s (0 through 2) to store all the bits. Một mảng của 20 bit (0 đến 19) với 8 bit unsigned char s cần 3 unsigned char s (0 đến 2) để lưu trữ tất cả các bit.
char       0       1         2 char 0 1 2
      +--------+--------+--------+ +--------+--------+--------+
      |        |        |        | | | | |
      +--------+--------+--------+ +--------+--------+--------+
bit    01234567 8911111111111XXXX bit 01234567 8911111111111XXXX
                  012345 6789 012345 6789
    
The array data is contained inside a structure/class which includes a count of the number of bits in the array, and a pointer to the memory storing the array. Các dữ liệu được chứa bên trong mảng cấu trúc / lớp trong đó bao gồm một số của số bit trong mảng và con trỏ đến bộ nhớ lưu trữ các mảng. Since arrays may be of arbitrary size, the memory storing the array is dynamically allocated on the heap. Kể từ khi các mảng có thể có kích thước tùy ý, các bộ nhớ lưu trữ các mảng cấp phát động trên heap.
The C++ bitarray class overloads bitwise operators (&, |, ^, ...), providing the expected results on bitarray objects. C + + quá tải toán tử trên bit lớp bitarray (&, |, ^, ...), cung cấp các kết quả mong đợi trên các đối tượng bitarray. The C bitarray library provides functions (BitArrayAnd, BitArrayOr, BitArrayXor, ...) for similar functionality. Các thư viện bitarray C cung cấp các chức năng (BitArrayAnd, BitArrayOr, BitArrayXor, ...) cho các chức năng tương tự.
I have written the bitarray library so that functions and methods requiring multiple bit arrays (such as BitArrayAnd or &), will not do anything if they are given arrays of differing sizes to operate on. Tôi đã viết thư viện bitarray để chức năng và các phương pháp đòi hỏi nhiều mảng bit (như BitArrayAnd hoặc &), sẽ không làm bất cứ điều gì nếu họ được cho mảng của các kích cỡ khác nhau để hoạt động trên.
With native arrays, square brackets ( [] ) may be used to either obtain the value of an array element 1 , or to obtain a pointer to an array location 2 . Với mảng bản địa, dấu ngoặc vuông ( [] ) có thể được sử dụng để hoặc là đạt được giá trị của một phần tử mảng 1 , hoặc để có được một con trỏ đến một vị trí mảng 2 .
case 1: Trường hợp 1:
if (array[index] == value) ... if (array[index] == value) ...

case 2: Trường hợp 2:
array[index] = value;

Unfortunately I have not found a way to do anything close to this with bitarrays in C. Đáng tiếc là tôi đã không tìm thấy một cách để làm bất cứ điều gì gần với bitarrays này trong C.
In C++ it's not possible to overload square brackets ( [] ) to behave both ways. Trong C + + nó không thể quá tải dấu ngoặc vuông ( [] ) để hành xử theo cả hai cách. Consequently square brackets ( [] ) returns a bit value and parenthesis ( () ) returns a class that behaves as a pointer to a bit in the array. Do đó dấu ngoặc vuông ( [] ) trả về một giá trị bit và dấu ngoặc đơn ( () ) trả về một lớp học mà cư xử như một con trỏ tới một chút trong mảng. The class returned by parenthesis ( () ) may only be used for assigning bit values. Lớp trả về bởi dấu ngoặc đơn ( () ) chỉ có thể được sử dụng để gán các giá trị bit.

Usage Cách sử dụng

Rather than writing lengthy man pages for each of the functions in the bitarray library, I have taken a cheap cop-out. Thay vì viết các trang người đàn ông dài cho từng chức năng trong thư viện bitarray, tôi đã thực hiện một cảnh sát giá rẻ-out. The bitarray source includes detailed headers preceding each function, and I have included a file named sample.[c|cpp] which demonstrates the usage of each function in the bitarray library. Các nguồn bitarray bao gồm tiêu đề chi tiết trước mỗi chức năng, và tôi đã bao gồm một tên file mẫu]. [C | cpp đó chứng tỏ việc sử dụng của từng chức năng trong thư viện bitarray.

Portability Löu

All the source code that I have provided is written in strict ANSI C or ISO C++. Tất cả các mã nguồn mà tôi đã cung cấp được viết bằng đúng ANSI C hoặc ISO C + +. I would expect it to build correctly on any machine with ANSI C/ISO C++ compilers. Tôi sẽ mong đợi nó để xây dựng chính xác trên bất kỳ máy tính với ANSI C / C + + biên dịch tiêu chuẩn ISO. I have tested the code compiled with gcc on Linux on an Intel x86 and mingw on Windows XP. Tôi đã thử nghiệm mã biên dịch với gcc trên Linux trên Intel x86 và MinGW trên Windows XP.
The library includes the routines intended for debugging which dump the array contents to a display. Thư viện này bao gồm các thói quen dùng để gỡ lỗi mà đổ mảng nội dung để hiển thị. These routines assume that unsigned char s are 8 bits. Những thói quen cho rằng unsigned char s là 8 bit. These routines can easily be written to support any specific size unsigned character. Những thói quen có thể dễ dàng được viết để hỗ trợ bất kỳ dấu kích thước nhân vật cụ thể. Writing the dump routines to handle arbitrary size unsigned char seems more difficult than it is worth to me. Viết bãi thói quen xử lý các kích thước tùy ý unsigned char có vẻ khó khăn hơn đó là giá trị với tôi. Especially since I only have access to machines with 8 bit unsigned char s. Đặc biệt kể từ khi tôi chỉ có thể truy cập máy với 8 bit unsigned char s.

Download Tải về

An archive containing the source for each bitarray library may be downloaded by clicking on the links below. Một kho lưu trữ có chứa các mã nguồn cho mỗi thư viện bitarray có thể được tải về bằng cách nhấp vào liên kết bên dưới. My source has been released under the GNU LGPL . nguồn của tôi đã được phát hành theo GNU LGPL .
Language Ngôn ngữ Archive Lưu Trữ
ANSI C ANSI C bitarray-0.3.zip bitarray-0.3.zip
ISO C++ ISO C + + bitarray_cpp-0.4.zip bitarray_cpp-0.4.zip

My latest implementations of Huffman , LZSS , LZW , and arithmetic encoding all provide additional examples of how to use the C version of these libraries. triển khai mới nhất của tôi về Huffman , LZSS , LZW , và số học mã hóa tất cả các cung cấp thêm ví dụ về cách sử dụng các phiên bản C của các thư viện này. If you still have any questions or comments feel free to e-mail me at mdipper@alumni.engr.ucsb.edu . Nếu bạn vẫn có thắc mắc hoặc ý kiến cảm thấy tự do để gửi email cho tôi tại mdipper@alumni.engr.ucsb.edu .
You might also want to visit DataCompression.info for additional information on all things related to compression. Bạn cũng có thể muốn ghé thăm DataCompression.info cho thêm thông tin về tất cả những thứ liên quan đến nén.

Không có nhận xét nào:

Đăng nhận xét