配列から7bitずらしてデータを読み込む

[戻る]
どん 2010/03/07(日) 15:33:51
上位からchar[256]データを受け取って、そこから先頭7ビットは捨てて
8ビット目から文字列情報最大126文字(バイト)が入っているため
char[126]を定義して文字列情報を格納しようと思っているのですが
どのようにすれば宜しいかご教授願えないでしょうか?

wclrp ( 'o') 2010/03/07(日) 20:22:57
2進数で図解を書いてその通りのプログラムを書けばいい。

data[i] data[i+1] data[i+2]を2進数で考える。
判りやすいように表現する。
abcdefgh ijklmnop qrstuvwx
これが
hijklmno pqrstuvwx
こうなってほしいわけだ。

そのためにビットをどう動かすか。

data[i]を7ビット左ずらしてはみ出たの消せば h0000000
data[i+1]を1ビット右ずらせば 0ijklmno
合わせれば hijklmno

以下実装例

以下は126を超える変なデータかチェックしてない。
入力と出力を同じdata引数にしている。
入力データを使い果たすか出力で0になるまでの個数を返す。

int test(char * data, int size)
{
    unsigned char * pos = (unsigned char*)data;

    int i;
    for(i=0; i<size-1; ++i) {
        pos[i] = ((pos[i] << 7) & 0x80) | ((pos[i+1] >> 1) & 0x7f);
        if(pos[i] == 0) {
            break;
        }
    }

    return i;
}

unsigned char に変えているから & 0x7f は要らんな。

どん 2010/03/07(日) 21:18:07
[[解決]]
ありがとうございました。

古いスレッドには追加発言できません。