Простой способ преобразовать строку из 0 и 1 в символ?Обычный C

StackOverflow https://stackoverflow.com/questions/2521237

  •  22-09-2019
  •  | 
  •  

Вопрос

Я делаю проект стеганографии, в котором я считываю в байтах из файла ppm и добавляю младший значащий бит в массив.Таким образом, как только будет считано 8 байт, у меня в моем массиве будет 8 бит, что должно равняться некоторому символу в скрытом сообщении.Есть ли простой способ преобразовать массив из 0 и 1 в значение ascii?Например, массив: char bits[] = {0,1,1,1,0,1,0,0} было бы равно 't'. Обычный C

Спасибо за все ответы.Я собираюсь попробовать что-нибудь из этого.

Это было полезно?

Решение

Простой for цикл будет работать - что-то вроде


    unsigned char ascii = 0;
    unsigned char i;

    for(i = 0; i < 8; i++)
       ascii |= (bits[7 - i] << i);

Возможно, есть более быстрый способ сделать это, но это, по крайней мере, начало.

Другие советы

Я бы не стал хранить биты в массиве - я бы использовал их с помощью символа char.

Итак, вы начинаете со значения char, равного 0: char bit = 0;

Когда вы получите первый кусочек, ИЛИ это с тем, что у вас есть: bit |= bit_just_read;

Продолжайте делать это с каждым битом, соответствующим образом смещаясь;т.е. после того, как вы получите следующий бит, выполните bit |= (next_bit << 1);.И так далее.

После того, как вы прочитаете свои 8 бит, bit будет соответствующее значение ASCII, и вы можете распечатать его или сделать с ним все, что захотите.

Я согласен с mipadi, сначала не утруждайте себя сохранением в массиве, это отчасти бессмысленно.Поскольку вам приходится зацикливать или иным образом отслеживать индекс массива во время его чтения, вы также можете сделать это за один раз.Может быть, что-то вроде этого?

bits = 0;

for ( i = 0; i < 8; ++i ) {
    lsb = get_byte_from_ppm_somehow() & 0x01;
    bits <<= 1 | lsb;
}

До тех пор, пока порядковый номер в конце бита правильный, это должно работать и компилироваться довольно мало.Если порядковый номер в конце бита обратный, то вы должны иметь возможность изменить начальное значение mask на 1, сдвиг маски на <<= , и вам, возможно, потребуется использовать (0x0ff & mask) в качестве условия do{}while , если ваш компилятор не выполняет то, что должен, с переменными размером в байт.Не забудьте сделать что-нибудь для магических функций, которые я включил, когда я не знал, чего вы хотите или как вы что-то сделали

#include <stdint.h> // needed for uint8_t
...
uint8_t acc, lsb, mask;
uint8_t buf[SOME_SIZE];
size_t len = 0;

while (is_there_more_ppm_data()) {
    acc = 0;
    mask = 0x80; // This is the high bit
    do {
         if (!is_there_more() ) {
             // I don't know what you think should happen if you run out  on a non-byte boundary
             EARLY_END_OF_DATA();
             break;
         }
         lsb = 1 & get_next_ppm_byte();
         acc |= lsb ? mask : 0; // You could use an if statement
         mask >>= 1;
    } while (mask);
    buf[len] = acc; // NOTE: I didn't worry about the running off the end of the buff, but you should. 
    len++;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top