从8位转换为1位

时间:2012-12-02 08:45:01

标签: c++ byte bit-shift

我有一个8位的字符串,我想将其转换为1个字节。我不确定为什么我的功能不能正常工作。我将8位存储到8个无符号字符的数组中。到目前为止,这是我的方法:

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 个答案:

答案 0 :(得分:5)

sum += bits[i];

如果您尝试转换C 字符串(例如,"1010101"),此代码会添加codetable值(ASCII,UTF-8,无论您使用哪种编码) char(例如,48和49),而不是10。您应该将其重写为

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

此外,您没有初始化bits数组 - 在初始化之前使用其内容导致未定义的行为,因此您可以表达任何

此外,您的代码逻辑存在缺陷 - 第一,您需要在添加二进制数字之前执行左移。二,你正在向后穿过绳子;这条线

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

应该是

for (int i = 0; i < 8; i++)

答案 1 :(得分:1)

在正常情况下,这应该可以正常工作。

char []包含什么?它是否包含'0','1'而不是0,1?

确保更改行

sum += bits[i];

sum |= bits[i] & 1;

另外,正如Vaughn Cato在评论中指出的那样,你需要在添加之前移动

答案 2 :(得分:-1)

如果任何人仍然有兴趣将位转换为字节,请查看这个要点。我准备它作为Arduino的草图,以便我可以发出代表每个字节的电脉冲。我使用int而不是字符的数组,但概念是相同的。考虑到这些类型的大小,我可能很快将其切换为byte或char。

特别要看一下encodeByte和decodeByte函数

草图用于传输位gist

答案 3 :(得分:-1)

#include <stdint.h>

int main()
{
    uint8_t aa=0x41; 
    printf("%c",aa);  //A
}