2012-05-21 23 views
7

バイトのストリームを文字エンコーディングに変換する特定の要件があります。これは、文字あたり6ビットになることがあります。8ビットのバイトを6ビットの文字に変換するにはどうすればよいですか?

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++)。ありがとうございました!

+0

逆の質問があると思われる人がいますか? – Marine1

答えて

6

まあ、3バイトごとに4文字になります。したがって、入力が3バイトの倍数でない場合は、何をすべきかを検討する必要があります。 (base64のような何かのパディングがありますか?)

次に、私はおそらくそれぞれの3バイトを順番に取るでしょう。誰かが興味を持っている場合は念のために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

良いこと、ありがとう。あなたが疑問に思っている場合に備えて、あなたの質問に答える...それはいつも詰まっています。 –

3

用する擬似コード十分近いC#のでは - とすぐに、彼らはそこに表示されるストリームから6ビット数を抽出し、別の変種。つまり、現在3バイト未満が読み込まれていても結果を得ることができます。パッドアップされていないストリームには便利です。

アキュムレータaの状態を、変数nに保存します。これは、以前の読み出しからのアキュムレータに残っているビット数を格納します。

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

本当にいいです!ありがとう –