0

バイト配列から読み取りたい s32 というマルチバイト プリミティブ型があります。

仕様は次のとおりです。

  • これは 32 ビットの符号付き整数値で、リトルエンディアン順に格納されます。

  • 負の整数は、2 の補数を使用して表されます。

  • 大きさに応じて 1 ~ 5 バイトを使用します。各バイトは、下位 7 ビットが値に寄与します。上位 (8 番目) ビットが設定されている場合、次のバイトも値の一部です。

  • 符号拡張が適用されます。エンコードの最後のバイトの 7 番目のビットが伝播され、デコードされた値の 32 ビットが埋められます。

U32 - unsigned 32-bit の場合、私はこれを考え出しました (どんなコメントも歓迎します!) が、S32 用にそれを変更する方法がわかりません。

char temp = 0; 
u32 value = 0;
size_t index = 0;

for(int i = 0; i < 5; i++)
{
    if(i < 4)
    {
        temp  = 0x7F & buffer[index];
    }
    else
    {
        temp = 0x0F & buffer[index];
    }

    value |= temp << (7 * i);

    if(!(0x80 & buffer[index])) break;

    ++index;
}

みんな、ありがとう!

4

2 に答える 2

0

この質問へSIGN_EXTENDの回答にマクロを投稿しました。あなたのコードでは、あなたをに変更し、SIGN_EXTENDを次のように適用しますu32 values32 value

// after loop close
SIGN_EXTEND(value, index * 7, u32);

質問に対して受け入れられた回答を使用して、次のように言います。

if(value > (1 << (index * 7 - 1))
    value -= (1 << (index * 7));
于 2010-07-14T16:07:27.063 に答える
0

リトルエンディアン システムで作業していますか?
もしそうなら、以下はトリックを行うべきです。

if(!(0x80 & buffer[index])) 
{
  if(0x40 & buffer[index])  value = -value;
  break;
}

ビッグ エンディアン システムでリトル エンディアン値の負の値が必要な場合は、もう少し注意が必要ですが、その要件は私には非常に奇妙に思えます。

于 2010-07-14T15:35:45.220 に答える