PHP에서 Pack () 함수는 강력한 이진 데이터 포장 도구로, 종종 네트워크, 파일 형식 분석 및 기타 시나리오에서 전송되는 이진 데이터를 생성하는 데 종종 사용됩니다. 지정된 형식 문자열에 따라 데이터를 이진 문자열로 변환합니다. 그러나 많은 개발자들은 종종 "일관되지 않은 데이터 길이가 비정상적인 행동 으로 이어진다"는 문제를 겪습니다. 이 기사는 원인을 자세히 분석하고 문제 해결 방법을 가르쳐 줄 것입니다.
pack () 함수는 두 가지 매개 변수를 수락합니다.
string pack(string $format, mixed $values, mixed ...$values)
$ 형식 : 형식 문자열, 데이터의 유형과 길이를 정의합니다. 예를 들어 A4는 4 바이트 문자열을 나타내고 N은 32 비트 부호없는 Big-Endian Inter 등을 나타냅니다.
$ 값 : 해당 형식의 입력 데이터.
데이터를 형식으로 포장하는 이진 문자열을 반환합니다.
A4 (고정 4 바이트 문자열) 형식을 사용하여 길이가 4 개 미만인 문자열을 패키지한다고 가정하면 PHP는 빈 바이트로 자동으로 채우며 일반적으로 예상되는 동작입니다.
그러나 형식이 데이터와 일치하지 않거나 숫자 유형의 길이가 올바르지 않으면 다음과 같습니다.
출력 데이터는 비정상적이어서 후속 구문 분석 실패를 초래합니다.
네트워크 프로토콜에는 오류가 있으며 정상적으로 통신을 수행 할 수 없습니다.
파일 형식이 잘못되었고 파일이 손상되었습니다.
예를 들어:
<?php
// 예상하다4바이트 스트링,그러나만3바이트
echo bin2hex(pack('a4', 'abc')); // 61626300,끝에 끝났습니다0바이트
// 예상하다4바이트整数,그러나 줄을 통과하면 예외가 발생합니다
echo bin2hex(pack('N', 'abc')); // 오류가보고되거나 예측할 수없는 데이터가 생성됩니다.
?>
pack () 의 형식 문자열은 유형에 매우 민감합니다. 숫자 유형 형식 (예 : n , l )은 정수 데이터가 필요하며 문자열 형식 (예 : a , a )에는 문자열이 필요합니다.
<?php
$int = 1234;
$str = "hello";
// 올바른 사용법
$data = pack('N', $int);
// 잘못된 사용(예외가 발생합니다)
$data = pack('N', $str);
?>
A4 및 A8 과 같은 고정 길이 문자열 형식의 경우 문자열 길이가 충분한 지 너무 길어 지는지 확인하십시오.
a 형식이 충분하지 않은 경우 빈 바이트를 작성합니다.
A 형식 A가 불충분 할 때 공간을 채우는 것입니다.
너무 오래 잘릴 것입니다
<?php
echo bin2hex(pack('a4', 'abcde')); // 61626364,과도한 부분이 잘립니다
echo bin2hex(pack('A4', 'ab')); // 61622020,나중에 공간을 구성합니다
?>
Bin2Hex () 함수를 사용하여 Pack () 가 반환 한 이진 데이터의 16 진수 표현을보고 기대치를 충족하는지에 대한 분석을 용이하게합니다.
<?php
$data = pack('a4N', 'abc', 1234);
echo bin2hex($data);
?>
Pack ()는 여러 형식 문자와 해당 여러 값을 지원하며 순서를 일치시켜야합니다.
<?php
// 형식 문자열은 있습니다2형식 문자,통과해야합니다2매개 변수
$data = pack('a4N', 'test', 100);
?>
매개 변수 수가 일치하지 않으면 결과가 잘못 될 수 있습니다.
공식 매뉴얼 및 커뮤니티 튜토리얼은 매우 유용합니다. 샘플 코드 액세스 주소는 다음과 같습니다.