2012-02-10 14 views
2

私は、符号無しの束をメモリにパックするアルゴリズムを逆にしようとしています。私はそれを逆転させようとしましたが、私は正しい数字を50%〜75%戻していますので、私は何が間違っているのか分かりません。すべての数字がメモリにパックされるまでは、次の呼び出しに返さBSTARTを渡して、行に数回呼ばれビットパッキングアルゴリズムを反転する

BYTE packNumber(BYTE bStart, WORD value, BYTE * buffer, DWORD * counter) 
{ 
    value = (value<<(6-bStart)); 
    *(buffer + *counter) |= (BYTE)(value>>8); 
    *(buffer + *counter+1) |= (BYTE)value; 

    bStart = (bStart+2)%8; 

    if (bStart) 
     *counter+= 1; 
    else 
     *counter+= 2; 

    return bStart; 
} 

この

はメモリに数値をパックするためのアルゴリズムです。

これはそれを逆転で私の試みです:、私は正しいデータの束を取り戻すため、私はメモリに書いた数字にもよるが、私は、私は右の何かをやっている知っている

BYTE unpackNumber(BYTE bStart, WORD *value, BYTE * buffer, DWORD * counter) 
{ 
    *value= 0; 

    *value|= *(buffer + *counter); 
    *value= *value<< 8; 
    *value|= *(buffer + *counter+1); 

    *wVal = (*value>>(6-bStart)); 

    bStart = (bStart+2)%8; 

    if (bStart) 
     *counter+= 1; 
    else 
     *counter+= 2; 

    return bStart; 
} 

から何か読み込まれた2番目から4番目までの数字が間違っています。

私がここで間違っていることは何ですか?

+1

あなたは英語であなたのパッキングアルゴを説明できますか?数式(可読性)の場合でも、つまり:value =(x * 8)| yz << xyz – Adrian

+0

下記の私の答えの後でさえ、コードを分析するだけで、コンパクトな方法を正確にはわかりません。 –

+0

@Adrianそれは、16ビットのワードのうち10ビットを取り出し、4バイトを5バイト(40ビット)に戻してパッキングするようです。 –

答えて

3

コードをすばやく見るだけで、というWORDは符号なしとして動作するように見えます。あなたが希望するので、また:

私はほとんどそれがないことを賭けるだろう、とあなたのシフトが署名されてしまう(したがって高いビットは、符号ビットのゼロが、コピーされませんでシフト)

編集10ビットを出力する場合は、おそらく* wVal & = 0x03ffで可能な余分な上位ビットを削除する必要があります。

これは、符号なしの短いWORDで動作するようです。

BYTE unpackNumber(BYTE bStart, WORD *value, BYTE * buffer, DWORD * counter) 
{ 
    *value= 0; 

    *value|= *(buffer + *counter); 
    *value= *value<< 8; 
    *value|= *(buffer + *counter+1); 

    *value = (*value>>(6-bStart)) & 0x3ff; // <-- remove extraneous bits 

    bStart = (bStart+2)%8; 

    if (bStart) 
     *counter+= 1; 
    else 
     *counter+= 2; 

    return bStart; 
} 
+0

優れた推測もありますが、これはときどき動作する理由を説明していません。 –

+0

@MichaelDorgan bStart = 6または高ビットが0のパックドワードで動作し、bstart!= 6で高ビットが1のパックドワードでは失敗します。ランダムではなく、1/2-1/4音正しい周波数。 –

+0

良い点。しかし、彼の関数の入力に関するフィードバックがなければ、私たちは推測を続けなければなりません。神の間違いのバイナリのためのassert() –

0

あなたのCコードは私の頭を少し傷つけます。あなたは入場条件を宣言していますか?あなたのRAMへの書き出しがチェックなしで恐ろしいです。また、bStartが6より大きい場合、シフトは未定義です。私の推測では、bStart> 6が問題です。ところで、これはまったくC++コードではありません。まっすぐなCです。

+0

ええ、コードは私の頭も痛いです。私は関数が取得するすべてのデータが有効であることを確認しています。 また、行のため bStart =(bStart + 2)%8; bStartは、最初の入力値に応じて、0,2,4,6 – Ash

+0

または1,3,5,7から回転します。また、最初に、bstartは> 6になる可能性があります。私は本当にbstartにassert()を追加します。 –

+0

なぜdownvote? –