2012-05-21 49 views
7

Tôi có một yêu cầu cụ thể để chuyển đổi luồng byte thành mã hóa ký tự xảy ra là 6 bit cho mỗi ký tự.Làm cách nào để chuyển đổi các byte 8 bit thành các ký tự 6 bit?

Here's an example: 

Input: 0x50 0x11 0xa0 

Character Table: 

010100 T 
000001 A 
000110 F 
100000 SPACE 


Output: "TAF " 

Logically I can understand how this works: 

Taking 0x50 0x11 0xa0 and showing as binary: 

01010000 00010001 10100000 

Which is "TAF ". 

Cách tốt nhất để làm điều này theo chương trình (mã giả hoặc C++). Cảm ơn bạn!

+0

có ai đó xem xét đặt câu hỏi ngược lại không? – Marine1

Trả lời

6

Vâng, cứ 3 byte, bạn sẽ có bốn ký tự. Vì vậy, đối với một điều, bạn cần phải làm việc ra phải làm gì nếu đầu vào không phải là một bội số của ba byte. (Liệu nó có lớp lót của một số loại, như base64?)

Sau đó, tôi có thể lấy mỗi 3 byte lần lượt. Trong C#, đó là đủ gần để pseudo-mã cho C :)

for (int i = 0; i < array.Length; i += 3) 
{ 
    // Top 6 bits of byte i 
    int value1 = array[i] >> 2; 
    // Bottom 2 bits of byte i, top 4 bits of byte i+1 
    int value2 = ((array[i] & 0x3) << 4) | (array[i + 1] >> 4); 
    // Bottom 4 bits of byte i+1, top 2 bits of byte i+2 
    int value3 = ((array[i + 1] & 0xf) << 2) | (array[i + 2] >> 6); 
    // Bottom 6 bits of byte i+2 
    int value4 = array[i + 2] & 0x3f; 

    // Now use value1...value4, e.g. putting them into a char array. 
    // You'll need to decode from the 6-bit number (0-63) to the character. 
} 
+0

Công cụ tốt, cảm ơn bạn. Để trả lời câu hỏi của bạn trong trường hợp bạn đang tự hỏi ... nó luôn luôn được đệm. –

3

Chỉ trong trường hợp nếu có ai quan tâm - một biến thể rằng chiết xuất số 6-bit từ dòng ngay sau khi họ xuất hiện ở đó. Đó là, kết quả có thể đạt được ngay cả khi ít hơn 3 byte hiện đang đọc. Sẽ hữu ích cho các luồng không được đệm.

Mã tiết kiệm trạng thái của bộ tích lũy a trong biến n lưu trữ số bit còn lại trong bộ tích lũy từ lần đọc trước đó.

int n = 0; 
unsigned char a = 0; 
unsigned char b = 0; 
while (read_byte(&byte)) { 
    // save (6-n) most significant bits of input byte to proper position 
    // in accumulator 
    a |= (b >> (n + 2)) & (077 >> n); 
    store_6bit(a); 
    a = 0; 
    // save remaining least significant bits of input byte to proper 
    // position in accumulator 
    a |= (b << (4 - n)) & ((077 << (4 - n)) & 077); 
    if (n == 4) { 
     store_6bit(a); 
     a = 0; 
    } 
    n = (n + 2) % 6; 
} 
+0

thật tuyệt! cảm ơn –

Các vấn đề liên quan