Преобразование байтов C ++ в биты, а затем печать - PullRequest
1 голос
/ 29 сентября 2011

Код, полученный от: Байт до двоичного в C Кредит: BSchlinker

Следующий код, который я изменил, занимал более 1 байта за раз. Я изменил это, и получил его наполовину работающим, а затем действительно запутался в моих циклах. :( Я провел последние полтора дня, пытаясь выяснить это ... но мои навыки C ++ не очень хороши (все еще учатся!)

#include <iostream> 
using namespace std; 

char show_binary(unsigned char u, unsigned char *result,int len);

int main() 
{
    unsigned char p40[3] = {0x40, 0x00, 0x0a};
    unsigned char bits[8*(sizeof(p40))];
    int c;
    c=sizeof(p40);

    show_binary(*p40, bits, 3);
    cout << "\n\n";

    cout << "BIN = ";
    do{
        for (int i = 0; i < 8; i++)
            printf("%d",bits[i+(8*c)]);
        c++;
    }while(c < 3);

    cout << "\n";

    int a;
    cin >> a;
    return 0;
}

char show_binary(unsigned char u, unsigned char *result, int len) 
{ 
    unsigned char mask = 1;
    unsigned char bits[8*sizeof(result)];
    int a,b,c;
    a=0;
    b=0;
    c=len;

    do{
        for (int i = 0; i < 8; i++)
            bits[i+(8*a)] = (u[&a] & (mask << i)) != 0;
        a++;
        }while(a < len);

    //Need to reverse it?
    do{
        for (int i = 8; i != -1; i--)
            result[i+(8*c)] = bits[i+(8*c)];
        b++;
        c--;
    }while(b < len);

    return *result;
}

После того, как я выплюнул:

    cout << "BIN = ";
    do{
        for (int i = 0; i < 8; i++)
            printf("%d",bits[i+(8*c)]);
        c++;
    }while(c < 3);

Я бы хотел взять бит [11] ~ бит [конец] и вычислять байты каждые 8 ​​бит. Если это имеет смысл. Но сначала функция должна работать. Любые профессиональные советы о том, как это должно быть сделано? И, конечно, разорвать мой код на части. Мне нравится учиться.

1 Ответ

4 голосов
/ 30 сентября 2011

Чувак, в этом коде много чего происходит, поэтому трудно понять, с чего начать. Достаточно сказать, что ты слишком стараешься. Похоже, вы пытаетесь 1) передать байтовый массив; 2) превратить эти байты в строковое представление двоичного файла; и 3) превратить это строковое представление обратно в значение?

Так получилось, что недавно я сделал что-то похожее на C, которое должно работать с использованием компилятора C ++.

#include <stdio.h>
#include <string.h>

/* A macro to get a substring */
#define substr(dest, src, dest_size, startPos, strLen)  snprintf(dest, dest_size, "%.*s", strLen, src+startPos)

/* Pass in char* array of bytes, get binary representation as string in bitStr */
void str2bs(const char *bytes, size_t len, char *bitStr) {
    size_t i;
    char buffer[9] = "";
    for(i = 0; i < len; i++) {
        sprintf(buffer, 
            "%c%c%c%c%c%c%c%c", 
            (bytes[i] & 0x80) ? '1':'0', 
            (bytes[i] & 0x40) ? '1':'0', 
            (bytes[i] & 0x20) ? '1':'0', 
            (bytes[i] & 0x10) ? '1':'0', 
            (bytes[i] & 0x08) ? '1':'0', 
            (bytes[i] & 0x04) ? '1':'0', 
            (bytes[i] & 0x02) ? '1':'0', 
            (bytes[i] & 0x01) ? '1':'0');
        strncat(bitStr, buffer, 8);
        buffer[0] = '\0';
    }
}

Чтобы вернуть строку двоичного кода обратно в значение, это можно сделать с помощью сдвига битов:

unsigned char bs2uc(char *bitStr) {
    unsigned char val = 0;
    int toShift = 0;

    int i;
    for(i = strlen(bitStr)-1; i >= 0; i--) {
        if(bitStr[i] == '1') {
            val = (1 << toShift) | val;
        }

        toShift++;
    }

    return val;
}

Получив двоичную строку, вы можете взять подстроки из любых произвольных 8 бит (я думаю, меньше) и превратить их обратно в байты.

char *bitStr; /* Let's pretend this is populated with a valid string */
char byte[9] = "";
substr(byte, bitStr, 9, 4, 8); 
/* This would create a substring of length 8 starting from index 4 of bitStr */
unsigned char b = bs2uc(byte);

Я на самом деле создал целый набор функций value -> двоичная строка -> value, если вы хотите взглянуть на них. GitHub - binstr

...