我正在做一个隐写术项目,我从ppm文件中读取字节并将最不重要的位添加到数组中。所以一旦读入8个字节,我的数组中就会有8位,这应该等于隐藏消息中的某个字符。有没有简单的方法将0和1的数组转换为ASCII值?例如,数组:char bits[] = {0,1,1,1,0,1,0,0}
将等于't'。 Plain C简单的方法将0和1的字符串转换为字符? Plain C
感谢您的所有答案。我会给这些一些镜头。
我正在做一个隐写术项目,我从ppm文件中读取字节并将最不重要的位添加到数组中。所以一旦读入8个字节,我的数组中就会有8位,这应该等于隐藏消息中的某个字符。有没有简单的方法将0和1的数组转换为ASCII值?例如,数组:char bits[] = {0,1,1,1,0,1,0,0}
将等于't'。 Plain C简单的方法将0和1的字符串转换为字符? Plain C
感谢您的所有答案。我会给这些一些镜头。
一个简单for
回路会工作 - 像
unsigned char ascii = 0;
unsigned char i;
for(i = 0; i < 8; i++)
ascii |= (bits[7 - i] << i);
有可能是做这一个更快的方法,但这至少是一个开始。
我不会将这些位存储在一个数组中 - 我会或者用char来存储它们。
所以,你开始为0的字符值:char bit = 0;
当你得到第一位,或将其与你有什么:bit |= bit_just_read;
继续这样做的每一个比特,适当地转移;即在获得下一位后,执行bit |= (next_bit << 1);
。等等。
读完8位后,bit
将是合适的ASCII值,并且可以打印出来,或者做任何你想做的事情。
他的位是在另一个顺序。你必须改变你的权力,否则,假设next_bit是永远的,你总是以0x2结尾| bit_just_read –
我没有看到OP提及这些位的顺序,但是,我列出的算法必须根据顺序进行调整;是的,每一步都必须将剩下的值移回另一位。 – mipadi
他在他的问题中做了一个伪指派。 char bits [] =“0,1,1,1,0,1,0,0”;显然语法是可疑的,但对于't'是正确的,所以... –
我同意mipadi,不要在第一个数组中存储,这是没有意义的。由于您必须在读取数组时循环或以其他方式跟踪数组索引,因此您可以一次完成数组索引。也许这样的事情?
bits = 0;
for (i = 0; i < 8; ++i) {
lsb = get_byte_from_ppm_somehow() & 0x01;
bits <<= 1 | lsb;
}
只要位端正确,这应该工作和编译下来很小。 如果bit endian倒退,那么您应该能够将掩码的初始值更改为1,掩码转换为< =,并且您可能需要将(0x0ff &掩码)作为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++;
}
你真的是'“0,1,1,1,0 ,1,0,0" '?或者更像'{0,1,1,1,0,1,0,0}'的东西? – Gabe
是的,我的意思是大括号:P – Anon