Извлечение битов и стеганография - PullRequest
3 голосов
/ 04 июля 2011

Я играю со стеганографией. Я пытаюсь извлечь текстовый файл из изображения. Я могу прочитать файл, получить биты, но у меня есть проблема с извлечением этих битов.

int getbits( pixel p) {
    return p & 0x03;   
}

char extract ( pixel* image ) {
    static int postion;
    postion = 0;

    postion = *image;

    postion++;

    char curChar;
    curChar = '\0';
    for(int i = 0; i<4; ++i) {
        curChar = curChar << 2;
        curChar = curChar | getbits(postion);
    }
    return curChar;
}

Pixel - это неподписанный символ. У меня есть цикл, который вызывает extract() и fputc(3) возвращаемое значение. Я чувствую, что получаю мусор от этих битов. В результате я получаю массивные (1,5 гига) текстовые файлы взамен.

void decode( PgmType* pgm, char output[80] )
{
FILE*outstream;
int i, length;

outstream = fopen(output, "w");

if(!outstream)
{
    fatal("Could not open");
}
for(i=0; i < 16; ++i)
{
    length = length << 2;
    length = length | getbits(*pgm->image);
}
if ((length* 4) < (pgm->width * pgm->height))
{
    fatal("File Too Big");
}
for (i = 0 ;i<length; ++i)
{
    fputc(extract(pgm->image), outstream);

}
fclose(outstream);

}

Ответы [ 2 ]

2 голосов
/ 04 июля 2011

Дейв Ригби превосходный диагноз верен, но передача position в качестве параметра (а не увеличение его здесь) приведет к более легкому пониманию и более гибким процедурам:

char extract ( pixel* image, int position ) {
    char curChar = '\0';
    for(int i = 0; i<4; ++i) {
        curChar = curChar << 2;
        curChar = curChar | getbits(postion);
    }
    return curChar;
}

char *build_string(pixel *image) {
    int i;
    char *ret = malloc(SECRET_SIZE);
    for (i=0; i<SECRET_SIZE; i++) {
        ret[i]=extract(image, i);
    }
    ret[i] = '\0';
    return ret;
}

Затем, когда вы поймете, что изменение всех пикселей в строке делает это довольно очевидным, и вы предпочитаете использовать пиксели, расположенные со значениями Фибоначчи, изменение легко сделать:

char *build_string_via_fib(pixel *image) {
    int i;
    char *ret = malloc(SECRET_SIZE);

    for (i=0; i<SECRET_SIZE; i++) {
        ret[i]=extract(image, fib(i));
    }
    ret[i]='\0';
    return ret;
}

Вы могли бы вставить также вычисления Фибоначчи в свою подпрограмму extract(), но разложение функций на мельчайшие, самые полезные части дает вам отличную разборчивость, отличную тестируемость и лучшие шансы для будущего кода. -использование.

2 голосов
/ 04 июля 2011

На самом деле вы читаете только первый пиксель на изображении - [Редактировать], потому что, когда вы пытаетесь использовать статическую переменную, чтобы сохранить счет, как указывает Оли, вы немедленно перезаписываете его.

Вместо этого используйте позицию для отслеживания вашего счета;но храните данные в другой переменной:

Вместо этого extract() должно выглядеть примерно так:

char extract ( pixel* image )
{
   static int postion = 0;

   pixel data = image[position];

   postion++;

   // use 'data' for processing
}
...