从8位转换为1字节

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”!抱歉没有表述清楚。

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


2
在你的例子中,你没有把任何东西放进“bits”里。 - Vaughn Cato
1
你期望得到什么结果?因为你没有初始化“bits”,所以不应该对所示代码的输出有任何期望。 - bames53
3
请注意,在添加位之前需要进行移位操作。 - Vaughn Cato
@VaughnCato 嗯,找得不错?我可以把它加入我的回答中吗? - user529758
@H2CO3:当然,你问得很好。 - Vaughn Cato
4个回答

6
sum += bits[i];

如果您要将一个C 字符串(例如"1010101")转换,这段代码会添加字符的码表值(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++)

啊,太好了,这很有帮助!但是,我仍然打印错误的值...而且不幸的是我不知道为什么。例如:我在我的unsigned char bits中有以下内容= 10100101,这应该给我一个十进制值165。然而,当我打印byt时,我得到330。当我输入类似00110000这样的东西,它应该给我一个十进制值30,但我得到24。有什么想法吗? - user200081
@user200081 330 是 165 的两倍。你是否按照我建议的在加法之前移动了位?看起来好像没有。 - user529758
嗯,如果我的数组由'1'和'0'而不是1和0组成,会有什么区别吗?另外,如果我在加法之前移动移位,那么我的屏幕会打印出一堆空白字符... - user200081
@user200081 "现在请再次阅读我的答案,我所说的是我的数组包含'1'和'0',而不是数字1和0。" - user529758
@user200081,另外,您还有一个错误——您正在倒序遍历字符串... - user529758
哇,太谢谢了!这解决了所有的问题!我非常感激你的帮助! - user200081

2

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

char[] 包含什么?它包含 '0'、'1' 而不是 0 和 1 吗?

为了确保,修改行

sum += bits[i];

为了

sum |= bits[i] & 1;

同样的,正如Vaughn Cato在评论中指出的那样,您需要在添加之前进行移位。


1
这取决于字符代码“0”和“1”分别为偶数和奇数(如果假定ASCII,则仅凭运气). - user529758
是的,我假设使用C/cpp ascii... 因为问题标记为C++且只是简单的char,而不是wchar_t。另一个选项是减去'0',但我不确定他的数组是否包含1或'1';我的意思是,在他的情况下,这是否是真正的问题。 - anishsane
我的数组包含'1'和'0',所以很抱歉让你感到困惑! - user200081
sum<<=1; sum += bits[i]-'0';sum<<=1; sum += bits[i]-'0'; - user200081
如果您确定始终使用'1'和'0',而不是1和0,则这应该足够好。如果有可能交错使用0、1、'0'、'1',请使用bits[i]&1(在c/cpp中应该适用于标准char)。 - anishsane

-1
#include <stdint.h>

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

4
虽然这段代码可以回答问题,但提供关于为什么和/或如何回答问题的额外上下文信息会提高它的长期价值。 - mburesh

-1
如果有人仍然对将位转换为字节感兴趣,请查看这个gist。我将其准备为Arduino的草图,以便可以发送表示每个字节的电脉冲。我使用int数组而不是字符,但概念是相同的。考虑到这些类型的大小,我可能很快会将其切换为byte或char。
特别是要查看encodeByte和decodeByte函数。
传输位的草图 gist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接