2012-05-12 3 views
0

언팩으로 작업 할 때 b3이 3 비트 길이의 비트 스트링을 반환하기를 바랬다.Perl에서 비트 문자열 파싱

I의 (a 웹 소켓의 데이터 패킷을 구문 분석) 작성 될 기대했던 코드는했다 :

my($FIN,$RSV1, $RSV2, $RSV3, $opcode, $MASK, $payload_length) = unpack('b1b1b1b1b4b1b7',substr($read_buffer,0,2)); 

나는 이것이 내가 기대했던 것을하지 않는 것으로 나타났습니다.

위의 템플릿 대신 b16을 사용하면 첫 번째 변수에로드 된 전체 2 바이트가 "1000000101100001"이됩니다.

대단한데, 그 문제는 없습니다.

나는 지금까지 가지고있는 것을 사용할 수 있는데, 부분 문자열을 사용하여이 방법을 사용할 수 있습니까? 내가 시도한 것과 비슷한 템플릿으로 그 비트 문자열을 처리하는 방법이 있기를 바랬다. 오른쪽에있는 패킷에 대한 명세와 왼쪽에있는 변수 목록을 전달할 수있는 일종의 함수?

편집 : 정규식을 사용하여이 작업을 수행하고 싶지 않습니다. 자주 발생하는 매우 빡빡한 루프에 있기 때문입니다.

편집 2 : 비트 문자열을 (부울, 정수 등)으로 평가해야하는 것이 무엇인지 지정할 수있는 것이 이상적입니다.

+0

'$ read_buffer'에 무엇이 있습니까? –

+0

@ SinanÜnür $ read_buffer는 패킷의 이진 데이터입니다. – GoldenNewby

답변

1

정확하게 이해했다면 2 바이트 입력을 7 개의 새로운 변수로 나눠보십시오. 이 목적으로 비트 연산을 사용할 수 있습니다. 이것은 당신의 $opcode 값을 얻는 방법의 예입니다

my $b4 = $read_buffer & 0x0f00; # your mask to filter 9-12 bits 
$opcode = $b4 >> 8;    # rshift your bits 

(당신이 원하는 경우에, 어쩌면 하나의 문에서) 당신은 모든 변수에 대해 같은 조작을 할 수 있으며이 resonable 좋은 속도로 실행해야합니다.

+0

일반적으로 추출되는 비트 수는 더 명확하기 때문에 대개 가장 먼저 이동합니다 (예 :'$ $ opcode = ($ read_buffer >> 8) & 0xF;). – ikegami