2012-07-23 3 views
4

나는 작업중인 프로젝트, 즉 간단한 소프트웨어 afsk 모뎀을 위해 bitstuffing을 구현하려고합니다. 단순화 된 프로토콜은 다음과 같은 : 비트 스터핑을 위해 사용해야하는 데이터 구조는 무엇입니까?

0111 1110 # burst sequence 
0111 1110 # 16 times 0b0111_1110 
    ... 
0111 1110 
    ... 
    ...  # 80 bit header (CRC, frame counter, etc.) 
    ... 
0111 1110 # header delimiter 
    ... 
    ...  # data 
    ... 
0111 1110 # end-of-frame sequence 

지금 내가 헤더 나 데이터가 모두 6 연속 사람이 포함되어 있는지 확인해야합니다 때문에 수신 된 데이터의 예약 순서 0111 1110을 찾아야합니다. 비트 스터핑 (bit stuffing) (예 : 5 사람
11111111 
converts to 
111110111 

11111000 
converts to 
111110000 

내가 효율적으로이를 구현하려면 지금, 나는 내가 1과 0에 데이터 바이트를 변환 할 필요가 1과 0의 배열을 사용해서는 안 추측

의 모든 순서 후에 0을 삽입, 그런 다음 배열 등을 채 웁니다. 그러나 정적 크기의 비트 필드는 내용물의 길이가 비트 채우기로 인해 가변적이기 때문에 적합하지 않은 것으로 보입니다.

비트 스터핑을보다 효율적으로 수행하는 데 사용할 수있는 데이터 구조는 무엇입니까?

+0

나는 이것을 보았다. 이 작업을 수행하지 않았다면 데이터 구조 나 알고리즘이 필요합니까? –

답변

1

방금이 질문을 보았습니다. 답이없고 삭제되지 않았 음을 알기 때문에 나는 계속 대답 할 것입니다. 그것은이 질문을보고 다른 사람들에게 도움을 줄 수도 있습니다.

비트 스터핑 : 여기에서 최대 인접 시퀀스 1's5입니다. 51's 이후에 51's 다음에 0이 추가되어야합니다. 이와

#include <stdio.h> 
typedef unsigned long long int ulli; 

int main() 
{ 
    ulli buf = 0x0fffff01, // data to be stuffed 
     temp2= 1ull << ((sizeof(ulli)*8)-1), // mask to stuff data 
     temp3 = 0; // temporary 

    int count = 0; // continuous 1s indicator 

    while(temp2) 
    { 
     if((buf & temp2) && count <= 5) // enter the loop if the bit is `1` and if count <= 5 
     { 
      count++; 
      if(count == 5) 
      { 
       temp3 = buf & (~(temp2 - 1ull)); // make MS bits all 1s 
       temp3 <<= 1ull; // shift 1 bit to accomodeate the `0` 
       temp3 |= buf & ((temp2) - 1); // add back the LS bits or original producing stuffed data 
       buf = temp3; 
       count = 0; // reset count 
       printf("%llx\n",temp3); // debug only    
      }   
     } 
     else 
     { 
      count = 0; // this was what took 95% of my debug time. i had not put this else clause :-) 
     } 
     temp2 >>=1; // move on to next bit. 
    } 
    printf("ans = %llx",buf); // finally 
} 

문제는 더 그 10 5 연속 1 초가있는 경우 다음 오버 플로우 수 있다는 것입니다 : 여기

는 것을 수행하는 C 프로그램입니다. 나누고 나서 비트를 쓰고 반복하는 것이 좋습니다.

+0

답변 해 주셔서 감사합니다! 실제로 순환 버퍼로갔습니다. 비공개 계약으로 인해 불행히도 소스를 표시 할 수 없습니다. ( –

+0

thats ok.) 아무도 왜 그런 흥미로운 질문에 대답하지 않았는지 궁금합니다. –

관련 문제