5

我有一个 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

4 回答 4

6
sum += bits[i];

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

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

此外,您不初始化bits数组 - 在初始化之前使用它的内容会导致未定义的行为,因此您可以预期发生的任何事情。

此外,您的代码逻辑有缺陷 - 一,您必须在添加二进制数字之前进行左移。第二,您正在向后遍历字符串;线

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 回答
-1

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

特别看一下 encodeByte 和 decodeByte 函数

传输比特要点示意图

于 2015-01-30T21:37:46.583 回答
-1
#include <stdint.h>

int main()
{
    uint8_t aa=0x41; 
    printf("%c",aa);  //A
}
于 2019-03-15T16:33:30.253 回答