Простой способ преобразовать строку из 0 и 1 в символ?Обычный C
Вопрос
Я делаю проект стеганографии, в котором я считываю в байтах из файла 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++;
}