我正在做一个隐写项目中,我以字节为单位从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

所以,你开始为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;
}

只要该位尾数是正确的,这应该工作和向下编译非常小。 如果该位尾数是倒退,那么你应该能够面具的初始值更改为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++;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top