2012-05-21 19 views
7

Tengo un requisito específico para convertir una secuencia de bytes en una codificación de caracteres que resulta ser de 6 bits por carácter.¿Cómo se convierten los bytes de 8 bits a los caracteres de 6 bits?

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 ". 

¿Cuál es la mejor manera de hacer esto programáticamente (pseudocódigo o C++). ¡Gracias!

+0

alguien ha planteado la pregunta contraria? – Marine1

Respuesta

6

Bueno, cada 3 bytes, terminas con cuatro caracteres. Entonces, para empezar, necesita averiguar qué hacer si la entrada no es un múltiplo de tres bytes. (¿Tiene relleno de algún tipo, como base64?)

Entonces probablemente tomaría cada 3 bytes sucesivamente. En C#, que es lo suficientemente cerca de pseudo-código para 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

Cosas buenas, gracias. Para responder a tu pregunta en caso de que te lo estés preguntando ... siempre está acolchada. –

3

Sólo en caso de si alguien está interesado - otra variante que extrae los números de 6 bits de la corriente tan pronto como aparecen allí. Es decir, se pueden obtener resultados incluso si actualmente se leen menos de 3 bytes. Sería útil para las transmisiones sin relleno.

El código guarda el estado del acumulador a en la variable n que almacena el número de bits que quedan en el acumulador de la lectura anterior.

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

muy bueno! Gracias –

Cuestiones relacionadas