1

の配列がありunsigned charsます。基本的に私はビットの配列を持っています。

最初の16ビットが符号なし整数に対応していることを知っており、次を使用してその値を取得します。(u16)(*(buffer+ 1) << 8 | *abcBuffer)

u30次に、次のように記述さ れると呼ばれるデータ型がありますu30 - variable length encoded 30-bit unsigned integer value。u30の可変エンコードは、エンコードされた値の大きさに応じて1〜5バイトを使用します。各バイトは、その下位7ビットを値に寄与します。バイトの上位(8番目)ビットが設定されている場合、次のバイトも値の一部になります。

私はこの説明を理解していません:それはu30(30!)と言い、それから1から5バイトと言いますか?また、私は別のデータ型と呼ばれていますs24 - three-byte signed integer value.

このような非典型的なデータ型をどのように読み取る(値を取得する)必要がありますか?どんな助けでもありがたいです。

どうもありがとう!

4

4 に答える 4

4
i=0;    
val = buf[i]&0x7F;
while (buf[i++]&0x80)
{ 
  val |= (buf[i]&0x7F)<<(i*7);
}
于 2010-07-12T18:17:14.327 に答える
2

私が正しく理解していると仮定すると(常に疑わしい問題です)、以下は値を読み取ります。この例では、位置ゼロから開始します (iバッファー内の実際の位置によってオフセットする必要があります)。

   unsigned int val;
   unsigned char buf[300];
   int i;
   int shift;

   i = 0;

   buf[0] = 0x81;
   buf[1] = 0x3;
   val = 0;
   shift = 0;
   do
      {
      val |= (0x7F & buf[i] ) << shift;
      shift += 7;
      i++;
      } while (( buf[i-1] & 0x80 ) && ( i < 5 ));
   printf( "Val = %u\n", val );
于 2010-07-12T18:12:14.273 に答える
1

エンコーディング形式の説明は、おそらく多少非公式ですが、十分なはずです。アイデアは、1バイトを読み取り(それを と呼びますx)、最下位7ビットを取得x & 0x7Fし、同時に最上位ビットが設定されているかどうかを確認することです。現在のバイトの最上位ビットが設定されなくなるまで、7 ビット シーケンスを uint 変数にマージする小さなループを作成する必要があります。

数値の上限または下限で新しいビットをマージする必要があるかどうかを判断する必要があります ( a = (a << 7) | (x & 0x7F))。そのためには、正しい出力が何であるかを知っている 1 つのテスト シーケンスが必要です。

于 2010-07-12T18:13:18.670 に答える
0

可変長の 30 ビット値を読み取るには、次のようにします。

const char HIGH_BIT = 0x80;
const char DATA_MASK = 0x7F;
const char LAST_MASK = 0x03; // only need 2 bits of last byte
char tmpValue = 0; // tmp holder for value of byte;
int value = 0; holder for the actual value;
char* ptr = buffer; // assume buffer is at the start of the 30 bit number
for(int i = 0; i < 5; i++)
{
   if(i == 4)
   {
      tmpValue = LAST_MASK & *ptr;
   }
   else
   {
      tmpValue = DATA_MASK & *ptr;
   }

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

   if(!(HIGH_BIT & *ptr))
   {
      break;
   }
   if(i != 4)
   {
     ++ptr;
   }
}
buff = ptr; // advance the buffer afterwards.

@Mark: あなたの回答は、私がこれを入力している間に投稿されたもので、上位バイトを除いて機能します。値はわずか 30 ビットであるため、上位バイトの最初の 2 ビットのみが値に使用され、値の 8 ビット全体が使用されます。

于 2010-07-12T18:21:40.547 に答える