объединить массив в биты - PullRequest
       7

объединить массив в биты

0 голосов
/ 15 сентября 2018

Как я могу добиться следующей конкатенации 1 и 0 с массивом низкой плотности data в меньший, более плотно заполненный массив c

uint8_t data[16] = {1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1};
uint8_t c[2] = {0};
/*  desired result
    c[0] = 11011011
    c[1] = 10001101 
*/

Я немного борюсь здесь, до сих пор у меня все получилось, но, похоже, не работает так, как я ожидал:

static void compress(unsigned char *out, unsigned char *in, int length)
{
    for(int i=0; i<length; i++)
    {
        if((i+1)%9==0)
            out++;
        *out |= in[i]<<((length-i)%9);

    }
}  
int main(){
    compress(c,data,16);
    printf("%d",c[0]); //should be 219
    printf("%d",c[1]); //should be 177 (edit)
}

спасибо, что помогли мне!

Ответы [ 3 ]

0 голосов
/ 15 сентября 2018

Размер unit8_t составляет всего 8 бит, а не 9. Таким образом, по сути, ошибка в% 9 вместо% 8.


Вы можете использовать отдельный счетчик (b) для величины сдвига бита от 7 до 0. Как только он достигнет -1, продвиньтесь вперед.Начните с (length-1), потому что для длины 1 вы хотите, чтобы он был младшим битом, то есть со значением смещения 0.

static void compress(unsigned char *out, unsigned char *in, int length)
{
    for(int* p=in, int b=(length-1)%8; p<in+length; p++, b--)
    {
        if(b < 0)
        {
            out++;
            b = 7;
        }
        *out |= *p << b;
    }
}  

Также вы можете использовать что-то вроде out [(length-i-1) / 8] | = in [i] << (length-i-1)% 8 </p>


PS Порядок следования битов зависит от платформы ...

0 голосов
/ 15 сентября 2018
static void compress(uint8_t *out, uint8_t *in, size_t length)
{
    memset(out, 0, length >> 3 + !!(length & 7));
    for(size_t i = 0; i < length; i++)
    {
        out[i >> 3] |= (in[i] << (7 - (i & 7)));
        //out[i >> 3] |= ((!!in[i]) << (7 - (i & 7)));  - if array elements may be not only 0 or 1.
    }
}  

int main()
{
    uint8_t data[16] = {1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1};
    uint8_t c[sizeof(data) >> 3 + !!(sizeof(data) & 7)];

    compress(c,data,16);
    printf("%d\n",c[0]); //should be 219
    printf("%d\n",c[1]); //should be 141
}
0 голосов
/ 15 сентября 2018

Добавьте одну строку в ваш код printf ("%d %d\n", i,(length-i)%9 );, и вы увидите, в чем проблема.

Не используйте операцию по модулю, добавьте переменную, которая содержит число сдвига в битах (начальное значение 7), и сбросьте его, если оно отрицательное:

static void compress2(unsigned char *out, unsigned char *in, int length)
{
    int shift = 7;
    for(int i=0; i<length; i++)
    {
        *out |= in[i] << shift;
        if (--shift < 0)
        {
            ++out;
            shift = 7;
        }
    }
}
...