2010-07-15 2 views
0

비트 오프셋 및 길이를 제공하여 이진 데이터의 각 데이터 포인트를 식별하는 해당 "맵"파일이있는 일부 이진 데이터가 있습니다. 따라서 다음과 같은 매핑이있을 수 있습니다.PHP : 바이너리 데이터의 임의의 오프셋 위치에서 임의의 비트 수 읽기

$paths = array ("path1" => array ("offset" => 224, "size" => 2), 
       "path2" => array ("offset" => 226, "size" => 6), 
); 

실제로 오프셋/크기 매핑에는 수만개의 경로가 있습니다. 이제 경로를 통해 적절한 오프셋을 찾고 크기에 의해 주어진 비트 수를 읽을 수 있기를 원합니다. 이 간단한 경우 path1과 path2는 단일 바이트를 나타내며 path1은 처음 2 비트이고 path2는 마지막 6 비트입니다.

이미 파이썬이 작성했습니다 지금은 전체 바이트 오프셋 난 그냥 함께 풀고 사용할 수 있습니다에서 전체 바이트 크기에, 어쨌든 :)

에 가지 않을 이유 PHP하는 코드를 통해 포팅하고

적절한 서식 캐릭터 라인 내가 겪고있는 문제는 이러한 "이상하게"크기의 비트 세트를 처리하는 방법입니다.

내가 생각한 유일한 방법은 오프셋 모듈러스 8이 0 (전체 바이트)을 제공하고 주어진 오프셋보다 작 으면 가장 가까운 비트 오프셋을 찾는 것이고 가장 작은 크기 (다시 전체 바이트 크기)를 찾는 것입니다.) 모든 필요한 비트를 포함하는이 새 오프셋에서 다음 원하는 비트를 마스크 비트 & 비트를 사용하십시오.

파이썬에서는 bitbuffer 모듈을 사용하여 비트 오프셋을 찾은 다음 원하는 비트 수를 읽을 수있었습니다. PHP 세계에서 이와 비슷한 것은 무엇입니까?

감사합니다.

답변

0

비트 마스크를 사용하여 전체 바이트를 잡아내는 해결책은이를 수행하는 방법과 비슷합니다. 그렇다면 관심있는 비트가 바이트 경계에서 끝나지 않았을 수도 있으므로 오른쪽 시프트를 수행 할 것입니다.

느린 방법 일 것이지만, 이런 종류의 일을 할 수있는 내부 PHP 함수를 모른다.

+0

이것은 내가 ** ** 두려웠 던 대답입니다. – sberry

+0

나는 (0xffff << (32- $ leftoffset)와 같은 것을하는 것을 상상할 것이다.) | (0xffff >> 32-$ rightoffset))을 사용하여 64 비트 PHP에서 int가 64 비트가되도록 위의 값을 수정해야 할 수도 있습니다. PHP 라이브러리에서 라이브러리 함수가 없다면 PHP에서 이진 처리를 수행하는 데 아무런 문제가 없다는 것을 알 수 있습니다. 99 % 확신 할 수 없습니다 (거기에 약간의 기회가 있으며 단지 그것에 대해 알지 못합니다) . – thomasrutter

관련 문제