2011-04-29 7 views
2

저는 모두 8 비트 정수 인 이진 파일을 가지고 있습니다. 나는 PHP unpack() 함수를 사용하려고 시도했지만 1 바이트 정수로 작동하는 인수를 얻을 수 없다. 더미 바이트 데이터를 결합하여 'n'/ 'v'인수를 사용할 수 있도록 노력했습니다. 나는 이것을하기 위해 윈도우 머신으로 일하고있다. 궁극적으로 8 비트 이진 정수 문자열을 기반으로 정수 배열을 반환하는 함수를 싶습니다. 내가 시도 코드는 다음과 같습니다 -PHP - 8 비트 정수 읽기

$dat_handle = "intergers.dat"; 
$dat_file = fopen($dat_handle, "rb"); 
$dat_data = fread($dat_file, 1); 
$dummy = decbin(0); 
$combined = $dummy.$dat_data; 
$result = unpack("n", $combined); 
+0

""n "'은 부호없는 short - 16 비트입니다. 물론 8 비트 정수를 읽는 것은 16 비트 정수로 읽는다면 실패 할 것입니다.). 'unpack ("c", $ combined); 시도하십시오. –

+1

@ 프랭크 그의 아이디어는 실제로 소리입니다 (서명되지 않은 데이터라고 가정 함), 그의 실행은 잘못되었습니다. 그는''chr (0)'을 prepend해야 할 때''0 ''을 prepending합니다. 그것은 말하기를, 이것은 여전히 ​​그것을하는 잘못된 방법입니다! –

+0

맞습니다. decbin은 char "0"이 포함 된 PHP 문자열을 반환하는데, 이것은 전혀 목표가 아닙니다. –

답변

4

원하는 것은 char 데이터 유형입니다. 이제 서명 된 두 개의 버전 (소문자 c)과 서명되지 않은 대문자 (대문자 C)가 있습니다. 데이터에 맞는 것을 사용하십시오.

<?php 
    $byte = unpack('c', $byte); 
?> 

또한 데이터 파일이 단지 한 묶음이고 다른 것은 없으며 길이가 알면이 작업을 수행 할 수 있습니다. 이 파일에 얼마나 많은 바이트 모르는 경우

<?php 
    $bytes = unpack('c16', $byte); 
?> 

(길이 인 경우 (16). 행에 문자 서명),하지만 당신은 당신이 별표 (*)를 사용할 수 있습니다 바이트있을 것입니다 알고 EOF까지 읽을 코드.

<?php 
    $bytes = unpack('c*', $byte); 
?> 
1

다음은 당신이 (ord를) 원하는 일을해야합니다

$dat_handle = "intergers.dat"; 
$dat_file = fopen($dat_handle, "rb"); 
$dat_data = ord(fread($dat_file, 1)); 

은 무엇 당신이하려고하는 것은 단일 바이트의 정수 값을 검색합니다. 한 번에 한 바이트 씩 읽으므로 항상 한 개의 유효한 ASCII 문자 만 사용해야합니다. ord은 그 한 문자의 이진 값을 반환합니다.