我正在做一个隐写术项目,我从ppm文件中读取字节数,并将最低有效位添加到数组中。因此,一旦读入8个字节,我的数组中将有8位,这应该等于隐藏消息中的某个字符。有没有一种简单的方法将0和1的数组转换为ascii值?例如,数组:char bits[] = {0,1,1,1,0,1,0,0}
将等于't'。 Plain C
感谢所有答案。我要给他们一些镜头。
答案 0 :(得分:4)
一个简单的for
循环可以工作 - 类似于
unsigned char ascii = 0;
unsigned char i;
for(i = 0; i < 8; i++)
ascii |= (bits[7 - i] << i);
可能有更快的方法来做到这一点,但这至少是一个开始。
答案 1 :(得分:2)
我不会将这些位存储在数组中 - 我将它们与char一起存储。
所以你从char值0开始:char bit = 0;
当你得到第一位时,或者它与你拥有的一样:bit |= bit_just_read;
坚持每一位,适当地转移;也就是说,在你得到下一位之后,做bit |= (next_bit << 1);
。等等。
读完8位后,bit
将是适当的ASCII值,您可以将其打印出来或做任何你想做的事情。
答案 2 :(得分:0)
我同意mipadi,不要先在阵列中存储,这有点毫无意义。由于您必须在读取时循环或以其他方式跟踪数组索引,因此您可以一次性完成。也许是这样的事情?
bits = 0;
for ( i = 0; i < 8; ++i ) {
lsb = get_byte_from_ppm_somehow() & 0x01;
bits <<= 1 | lsb;
}
答案 3 :(得分:0)
只要位端是正确的,这应该可以工作并且编译得非常小。 如果位端是向后的,那么你应该能够将掩码的初始值更改为1,掩码移位到&lt;&lt; =,并且您可能需要(0x0ff&amp; mask)作为do {}同时有条件如果您的编译器没有使用字节大小的变量做它应该做的事情。 不要忘记为我所包含的魔法功能做些什么,我不知道你想要什么,或者你做了什么
#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++;
}