2

私は簡単な問題で立ち往生しています。コードは次のとおりです。

int main(int argc, char **argv)
{
  char buf[2] = {0xd, 0x1f};
  unsigned int a;

  a = ((buf[1] << 8) & 0xFF00) | buf[0];
  printf("%d\n",a);

  return 0;
}

a必要な値はです0x1FD(509)が、上記のプログラムを実行したときの出力はaです0x1F0D(7949)

どうすればこれを達成できますか?

編集:わかりました。明確にさせてください。コードスニペットに示すように、データを受け取るプロジェクトを行っています。簡単にするために、 local と宣言しました。主なことは、データを として解釈すること0x1FD(509)です。

4

4 に答える 4

6

プログラムは、あなたが要求したことを実行します。混乱の原因は0xd定数にあります。これは実際0x0dには です。なぜならcharは 8 ビットだからです。あなたがするようにそれを一緒に梱包すると0x1f、 が生成されます0x1f0d

于 2012-04-10T15:05:33.020 に答える
3

あなたが必要です

char buf[2] = {0xfd, 0x01};

つまり、ビットを右から左に「パック」する必要があります。

目的の値をゼロで埋めると、これはより明確になるため、完全なバイトの文字列として書き込まれます。

0x1FD= 0x01FD=(0x01 << 8) | 0xFD

于 2012-04-10T15:03:12.020 に答える
2

charは8ビットであるため、2つの16進数で表されます。

0x1FD変数が必要な場合aは、とで配列を初期化する必要が0xfdあり0x01ます。

于 2012-04-10T15:04:12.660 に答える
-1

空のビットを削除する必要があります。

unsigned pack(char bytes[2])
{
    char shift = 8;
    if (bytes[0] < 32)
        shift = 4;

    return (unsigned) ((bytes[1] << shift) | bytes[0]);
}
于 2012-04-10T15:04:50.843 に答える