我有一个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'!对不起,不清楚。
可能有人知道我在哪里出错了吗?我不确定为什么我的位没有正确转换为字节。有人可以帮忙吗?谢谢!
sum += bits[i];
如果您正在尝试转换C字符串(例如,"1010101"
),则此代码会添加char的codetable值(ASCII,UTF-8,无论您使用哪种编码)(例如,48和49),而不是1
和0
。你应该把它重写为
sum += bits[i] - '0';
此外,您不初始化bits
数组 - 在初始化之前使用其内容导致未定义的行为,因此您可以表达任何事情。
此外,您的代码逻辑存在缺陷 - 一,您必须在添加二进制数字之前执行左移。二,你正在向后穿过绳子;这条线
for (int i = 7; i >= 0; i--)
应该真的
for (int i = 0; i < 8; i++)
在正常情况下,这应该可以正常工作。
char []包含什么?它是否包含'0','1'而不是0,1?
为了确保,改变线
sum += bits[i];
至
sum |= bits[i] & 1;
另外,正如Vaughn Cato在评论中指出的那样,你需要在添加之前转移。
如果任何人仍然有兴趣将位转换为字节,请查看这个要点。我准备它作为Arduino的草图,以便我可以发出代表每个字节的电脉冲。我使用int而不是字符的数组,但概念是相同的。考虑到这些类型的大小,我可能很快将其切换为byte或char。
特别是看看encodeByte和decodeByte函数
用于传输比特gist的草图
#include <stdint.h>
int main()
{
uint8_t aa=0x41;
printf("%c",aa); //A
}