2012-06-21 9 views
2

안녕하세요. PHP에서 문제가 발생했습니다. 공간에서 24 비트 정수를 사용 했으므로 SPACE가 가장 중요한 곳에 바이너리 파일의 일부 데이터를 읽어야합니다. . 이제 24bit int in php

데이터의 대부분을 내가 그러나/압축 풀기 팩 포장을 풀고 읽을 수

24 비트 INT의 지원하지 않습니다의

가 나는 H의 *와 같은 데이터를 읽을 아마도 간단한 (예 : 000,104 말할) 수 있다고 생각하고 그것은 올바른 것이라고 var에 읽었습니다.

// example binary data say I had the following 3 bytes in a binary file 
// 0x00, 0x01, 0x04 

$buffer = unpack("H*", $data); 

// this should equate to 260 in base 10 however unpacking as H* will not get 
// this value. 

// now we can't unpack as N as it requires 0x4 bytes of data and n being a 16 bit int 
// is too short. 

누구도이 문제를 처리해야합니까? 어떤 해결책? 조언?

+0

은 매우 중요 속도를 높이거나 가장 빠른되지 않은 경우에도 간단한 솔루션으로 살 수 있나요 압축을 해제하기위한 예제 코드가? –

+6

1 바이트 만 남겨 두었습니까? '$ buffer = unpack ("N", "\ x00 $ data");' – DaveRandom

+0

처럼 작동하는 것 같은 Dave! <3 – Joe

답변

0

파일에 위와 같은 3 바이트 만있는 경우 @DaveRandom이 말한대로 가장 쉬운 방법은 패딩입니다. 그러나 긴 파일 인 경우이 방법은 비효율적입니다.

이 경우 비트 단위 연산자로 다시 채우면 각 요소를 char 및 short로 읽을 수 있습니다.

또는 12 바이트를 3 long으로 읽은 다음 비트 연산자를 사용하여 3 바이트의 4 그룹으로 분할 할 수 있습니다. 나머지 바이트는 위의 두 가지 방법으로 추출됩니다. 이것은 대용량 데이터에서 가장 빠른 솔루션이 될 것입니다.

unsigned int i, j; 
unsigned int dataOut[SIZE]; 

for (i = 0, j = 0; j < size; i += 4, j += 3) 
{ 
    dataOut[i]  = dataIn[j] >> 8; 
    dataOut[i + 1] = ((dataIn[j] & 0xff) << 16) | (dataIn[j + 1] >> 16); 
    dataOut[i + 2] = ((dataIn[j + 1] & 0xffff) << 8) | (dataIn[j + 2] >> 24); 
    dataOut[i + 3] = dataIn[j + 2] & 0xffffff; 
} 

다음 question

24/48 비트의 캐릭터가 너무