从8位转换为1位

问题描述 投票:4回答:4

我有一个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'!对不起,不清楚。

可能有人知道我在哪里出错了吗?我不确定为什么我的位没有正确转换为字节。有人可以帮忙吗?谢谢!

c++ byte bit-shift
4个回答
5
投票
sum += bits[i];

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

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

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

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

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

应该真的

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

1
投票

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

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

为了确保,改变线

sum += bits[i];

sum |= bits[i] & 1;

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


-1
投票

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

特别是看看encodeByte和decodeByte函数

用于传输比特gist的草图


-1
投票
#include <stdint.h>

int main()
{
    uint8_t aa=0x41; 
    printf("%c",aa);  //A
}
© www.soinside.com 2019 - 2024. All rights reserved.