2011-07-03 2 views
3

나는 스테 가노 그래피를 가지고 놀고있다. 이미지에서 텍스트 파일을 가져 오려고합니다. 파일을 읽고 비트를 얻을 수 있지만이 비트를 추출하는 데 문제가 있습니다.비트 추출 및 스테 가노 그래피

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; 
} 

픽셀은 서명되지 않은 문자입니다. 반환 값을 extract()fputc(3)이라고하는 루프가 있습니다. 나는이 쓰레기들로부터 쓰레기를 얻는 것 같아. 그래서 나는 대용량 (1.5 기가) txt 파일을 보게된다. 당신이 OLI은 즉시 덮어 쓰기하고 지적으로, 수를 유지하기 위해 정적 VAR를 사용하려고 시도하는 동안 때문에 [편집] -

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); 

} 
+5

속기 또는 ** 스테 가노 그래피 **? –

+2

extract를 호출하는 루프를 보여줍니다. 이미지를 올바르게 순환하고 있음을 보여 주어야합니다. – borrible

+0

@borrible 루프를 포함했습니다. –

답변

2

당신은 실제로 이미지의 1 픽셀을 읽고있다.

대신 위치를 사용하여 개수를 추적하십시오. 그러나 다른 VAR의 데이터를 보유 :

가 대신 extract()가의 모양은 다음과 같습니다

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

    pixel data = image[position]; 

    postion++; 

    // use 'data' for processing 
} 
+0

이것은 빨간색 청어입니다. OP는 즉시'position'을'* image'로 겹쳐 씁니다 ... –

+0

@Oli : 실제로; 귀하의 의견에 따라 업데이 트되었습니다. – DaveR

+0

@Dave 메모리 액세스 오류가 발생합니다. –

2

데이브 릭비의 excellent diagnosis는 정확하지만 (여기 증가하고 하지) 매개 변수로 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() 루틴으로 계산하지만, 가장 작은, 가장 유용한, 조각으로 기능을 분해 우수한 가독성, 탁월한 테스트 가능성 및 향후 코드 재사용을위한 최상의 기회를 제공합니다.

관련 문제