2012-05-21 18 views
7

Ich habe eine bestimmte Anforderung, um einen Strom von Bytes in eine Zeichencodierung zu konvertieren, die zufällig 6 Bits pro Zeichen ist.Wie konvertiert man 8-Bit-Bytes in 6-Bit-Zeichen?

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

Was ist der beste Weg, dies programmgesteuert (Pseudocode oder C++) zu tun. Vielen Dank!

+0

hat jemand die umgekehrte Frage gestellt? – Marine1

Antwort

6

Nun, alle 3 Bytes, Sie am Ende mit vier Zeichen. Für eine Sache müssen Sie herausfinden, was zu tun ist, wenn die Eingabe kein Vielfaches von drei Bytes ist. (Hat es Padding irgendeiner Art, wie Base64?)

Dann würde ich wahrscheinlich jeweils 3 Bytes der Reihe nach nehmen. In C#, die nahe genug ist, um Pseudo-Code für 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

Gute Sachen, danke. Um Ihre Frage zu beantworten, falls Sie sich wundern ... es ist immer gepolstert. –

3

Nur für den Fall, wenn jemand interessiert - eine weitere Variante, die 6-Bit-Zahlen aus dem Strom extrahiert, sobald sie dort erscheinen. Das heißt, Ergebnisse können selbst dann erhalten werden, wenn weniger als 3 Bytes gelesen werden. Wäre nützlich für nicht gepolsterte Streams.

Der Code speichert den Status des Akkumulators a in der Variablen n, die die Anzahl der Bits speichert, die im Akkumulator vom vorherigen Lesevorgang verblieben sind.

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

echt nett! Vielen Dank –

Verwandte Themen