5

8ビットの文字列があり、それを1バイトに変換したいと思います。関数が正しく機能しない理由がわかりません。8ビットを8つのunsignedcharの配列に格納しています。これはこれまでの私の方法です:

unsigned int bitsToBytes(unsigned char *bits)
{
  unsigned int sum = 0;
  for(int i = 7; i >= 0; i--)
  {
    sum += bits[i];
    sum<<=1;
  }
  return sum;

}

int main()
{
  unsigned char bits[8];
  unsigned int byt;
  byt = bitsToBytes(bits);
  cout << byt; //doesn't give me the right result
}

編集:私のビット配列には、配列に「1」と「0」が含まれています!はっきりしないのでごめんなさい。

私がこれでどこが間違っていたのか誰かが知っているだろうか?ビットが正しくバイトに変換されない理由がわかりません。誰か助けてもらえますか?ありがとう!

4

4 に答える 4

6
sum += bits[i];

C文字列(たとえば)を変換しようとしている場合、このコードは、および"1010101"ではなく、char(たとえば、48および49)のコード化可能な値(ASCII、UTF-8、いずれかのエンコーディング)を追加します。これを次のように書き直す必要があります10

sum += bits[i] - '0';

また、配列を初期化しないでください。初期化のbits前にその内容を使用すると、未定義の動作が発生するため、が起こっても予測できます。

さらに、コードロジックに欠陥があります。1つは、2進数を追加する前に左シフトを実行する必要があることです。2つ目は、文字列を逆方向にトラバースしていることです。この線

for (int i = 7; i >= 0; i--)

本当にする必要があります

for (int i = 0; i < 8; i++)
于 2012-12-02T08:48:51.647 に答える
2

これは、通常の状況では正しく機能するはずです。

char []には何が含まれていますか?0、1の代わりに「0」、「1」が含まれていますか?

念のため、行を変更してください

sum += bits[i];

sum |= bits[i] & 1;

また、Vaughn Catoがコメントで指摘しているように、追加する前にシフトする必要があります。

于 2012-12-02T08:50:26.833 に答える