我有一个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'!很抱歉不清楚。
有谁知道我在哪里出错?我不确定为什么我的位没有正确转换为字节。有人可以帮忙吗?谢谢!
答案 0 :(得分:5)
sum += bits[i];
如果您尝试转换C 字符串(例如,"1010101"
),此代码会添加codetable值(ASCII,UTF-8,无论您使用哪种编码) char(例如,48和49),而不是1
和0
。您应该将其重写为
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
}