Saltar al contenido

Convertir matriz de bytes en conjunto de bits

este problema se puede tratar de variadas formas, pero en este caso te dejamos la que en nuestra opinión es la respuesta más completa.

Solución:

¿Algo como esto?

#include 
#include 

template
std::bitset bytesToBitset(uint8_t *data)

    std::bitset b;

    for(int i = 0; i < numBytes; ++i)
    
        uint8_t cur = data[i];
        int offset = i * CHAR_BIT;

        for(int bit = 0; bit < CHAR_BIT; ++bit)
        
            b[offset] = cur & 1;
            ++offset;   // Move to next bit in b
            cur >>= 1;  // Move to next bit in array
        
    

    return b;

Y un ejemplo de uso:

int main()

    std::array bytes =  0xDE, 0xAD, 0xBE, 0xEF ;
    auto bits = bytesToBitset(bytes.data());
    std::cout << bits << std::endl;

Hay un tercer constructor para bitset<> - no toma parámetros y establece todos los bits en 0. Creo que necesitará usar eso y luego recorrer el array vocación set() por cada bit en el byte array eso es un 1

Un poco de fuerza bruta, pero funcionará. Habrá un poco de complejidad para convertir el índice de bytes y el desplazamiento de bits dentro de cada byte en un índice de conjunto de bits, pero no es nada que un poco de pensamiento (y tal vez una ejecución bajo el depurador) no pueda resolver. Creo que es probablemente más simple y más eficiente que tratar de ejecutar el array a través de un string conversión o una transmisión.

Chicos, he pasado mucho tiempo escribiendo una función inversa (bitset -> byte/char array). Ahí está:

    bitset data = ...

    // bitset to char array
    char current = 0;
    int offset = 0;
    for (int i = 0; i < SIZE; ++i) 
        if (data[i])  // if bit is true
            current  // otherwise let it to be false
        if ((i + 1) % CHAR_BIT == 0)  // every 8 bits
            buf[offset++] = current; // save masked value to buffer & raise offset of buffer
            current = 0; // clear masked value
        
    

    // now we have the result in "buf" (final size of contents in buffer is "offset")

Si conservas algún recelo o forma de desarrollar nuestro crónica te inspiramos añadir una apostilla y con placer lo leeremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *