У меня есть строка из 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"
), этот код добавляет значение кодируемой таблицы (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++)
Это должно работать правильно, в нормальных ситуациях.
Что содержит символ []? Содержит ли он «0», «1» вместо 0, 1?
Чтобы убедиться, измените строку
sum += bits[i];
в
sum |= bits[i] & 1;
Также, как отметил Вон Катон в комментариях, нужно сместить до добавление.
Если кто-то все еще заинтересован в преобразовании битов в байты, посмотрите эту суть. Я подготовил это как набросок для Arduino, чтобы я мог посылать электрические импульсы, которые представляют каждый байт. Я использовал массивы int вместо символов, но концепция та же самая. Учитывая размер этих типов, я могу скоро переключить его на байт или символ.
в частности взгляните на функции encodeByte и decodeByte
Эскиз для передачи битов суть