2010-03-26 12 views
4

나는 ppm 파일에서 바이트 단위로 읽고 배열에 최하위 비트를 추가하는 스테 가노 프로젝트를 수행하고 있습니다. 그래서 8 바이트가 읽혀지면 내 배열에 8 비트를 갖게 될 것입니다. 이것은 숨겨진 메시지의 문자와 같아야합니다. 0과 1의 배열을 ASCII 값으로 변환하는 쉬운 방법이 있습니까? 예를 들어, 배열 : char bits[] = {0,1,1,1,0,1,0,0}은 't'와 같습니다. 일반 C0과 1의 문자열을 문자로 변환하는 쉬운 방법은 무엇입니까? 일반 C

모든 답변 주셔서 감사합니다. 나는 그 중 일부를 쏜다.

+0

당신은 정말 "'0,1,1,1,0을 의미합니까 , 1,0,0 "'? 아니면'{01110100}'과 같은 것일까 요? – Gabe

+0

예 중괄호를 의미 : P – Anon

답변

4

간단한 for 루프 작동합니다 -


    unsigned char ascii = 0; 
    unsigned char i; 

    for(i = 0; i < 8; i++) 
     ascii |= (bits[7 - i] << i); 

같은이 할 수있는 빠른 방법이있을 수 있습니다, 그러나 이것은 적어도 시작이다.

+0

for 루프에 누락 된 것이 있습니까? – stefanB

+0

일부 서식을 수정해야했지만 더 좋았습니까? –

+0

그래, 그게 실수 였어, 고마워. 비트는 '0'과 '1'을 포함하므로 루프를 업데이트했습니다. –

2

나는 비트를 배열에 저장하지 않겠다.

그래서 당신은 0의 char 값으로 시작 : char bit = 0;

당신이 첫 번째 비트를 얻을, 또는 그 때 당신은 무엇을 : bit |= bit_just_read;

는 각 비트에 적절하게 이동하는 것이 일을 계속; 즉, 다음 비트를 얻은 후 bit |= (next_bit << 1);을 수행하십시오. 기타 등등.

8 비트를 읽은 후에는 bit이 적절한 ASCII 값이 될 것이므로 인쇄하거나 원하는대로 무엇이든 할 수 있습니다.

+0

그의 비트가 다른 순서입니다.그리고 당신은 당신의 힘을 바꿔야합니다. 그렇지 않으면, next_bit이 설정되었다고 가정하면, 당신은 항상 0x2로 끝납니다. | bit_just_read –

+0

OP에 비트가 어떤 순서인지 언급하지는 않지만 그렇습니다. 주문에 따라 조정해야합니다. 예, 각 단계는 다른 비트에 의해 왼쪽으로 값을 이동해야합니다. – mipadi

+0

그는 자신의 질문에 의사 지정을했다. char bits [] = "01110100"; 분명히 문법은 의심 스럽지만 't'는 맞습니다. 그래서 ... –

0

나는 mipadi에 동의합니다. 우선 배열에 저장하는 것을 신경 쓸 필요가 없습니다. 그것은 무의미합니다. 배열 인덱스를 읽는 동안 배열 인덱스를 루프하거나 추적해야하므로 한 번에 수행 할 수 있습니다. 아마 이런 거 겠지?

bits = 0; 

for (i = 0; i < 8; ++i) { 
    lsb = get_byte_from_ppm_somehow() & 0x01; 
    bits <<= 1 | lsb; 
} 
0

비트 엔디안이 정확하면이 코드가 제대로 작동하고 컴파일되어야합니다. 비트 엔디안이 뒤로 있으면 마스크의 초기 값을 1로 변경하고 마스크는 < < =으로 바꿀 수 있으며 do {}로 (0x0ff & 마스크)를 가져야 할 수 있습니다. 컴파일러는 바이트 크기의 변수로 가정 된 것을 수행하지 않습니다. 난 당신이 원하는 것을 몰랐 내가 포함 된 매직 기능을위한 일을하는 것을 잊지 마십시오 당신이 뭔가

을 어떻게했는지
#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++; 
} 
관련 문제