PHP에서 Pack () 함수는 데이터를 이진 문자열로 패키지하는 데 사용되며 네트워크 통신, 파일 읽기 및 쓰기 및 기본 프로토콜 구현과 같은 시나리오에서 널리 사용됩니다. 이진 데이터를 생성하므로 디버깅 할 때 텍스트 데이터만큼 직관적이지 않습니다. 이 기사는 Pack () 에서 생성 된 이진 데이터를 효과적으로 디버깅하는 데 도움이되는 몇 가지 실용적인 방법을 공유합니다.
pack ()는 형식 문자열에 따라 파라미터를 바이너리로 변환합니다. 예를 들어:
<?php
// 서명되지 않은 짧은 정수와 문자열을 포장하십시오
$data = pack("nA5", 258, "hello");
echo bin2hex($data); // 산출 010268656c6c6f
?>
여기서 N은 서명되지 않은 짧은 정수 (2 바이트)의 네트워크 엔지니어를 나타내고 A5는 길이 5 (빈 패딩)의 문자열을 나타냅니다.
이진 데이터의 직접 인쇄는 종종 읽을 수 없으며 Bin2Hex () 로 16 진수로 변환하는 것이 가장 일반적인 디버깅 방법입니다.
<?php
$data = pack("Nn", 16909060, 258);
echo bin2hex($data); // 산출 010203040102
?>
이를 통해 원하는 엔지니어와 내용을 비교할 수 있습니다.
Unpack ()를 사용하여 이진 문자열을 구문 분석하여 데이터가 올바른지 확인하십시오.
<?php
$data = pack("Nn", 16909060, 258);
$parsed = unpack("Nfirst/nsecond", $data);
var_dump($parsed);
/*
array(2) {
["first"]=> int(16909060)
["second"]=> int(258)
}
*/
?>
Unpack ()가 예상 값을 올바르게 읽을 수 있다면 Pack () 에 의해 생성 된 데이터가 형식을 준수 함을 의미합니다.
디버깅에 네트워크 또는 파일 전송이 포함될 때 패킷 캡처 도구 (예 : Wireshark) 또는 HXD와 같은 16 진 편집기 (예 : HXD)를 사용하여 패킷을보고 바이너리 컨텐츠 및 프로토콜이 일치하는지 확인할 수 있습니다.
인쇄되지 않은 문자를 보려면 printf 또는 루프 바이트 바이트 출력을 사용할 수 있습니다.
<?php
$data = pack("C*", 0, 10, 255, 65);
for ($i = 0; $i < strlen($data); $i++) {
printf("%02X ", ord($data[$i]));
}
// 산출 00 0A FF 41
?>
팩 ()을 사용하여 도메인 이름을 m66.net 으로 표준화하기 위해 URL을 사용하여 데이터를 처리한다고 가정 해 봅시다.
<?php
$url = "https://m66.net/path/to/resource";
$parsed = parse_url($url);
$host = $parsed['host']; // m66.net
// 이진 데이터를 생성합니다,도메인 이름 길이와 도메인 이름 문자열 만 패키지되었다고 가정합니다.
$data = pack("nA*", strlen($host), $host);
echo bin2hex($data);
?>
이것은 URL과 관련된 바이너리 프로토콜을 디버깅하는 데 특히 유용합니다.
pack () 에 의해 생성 된 이진 데이터를 디버깅하는 핵심은 보이지 않는 바이너리를 16 진수와 같은 읽을 수있는 형식으로 변환하는 것입니다.
bin2Hex () 및 unpack ()를 사용하는 것이 가장 간단한 방법입니다.
디버깅과 결합 된 외부 도구를 사용하면 데이터 구조가보다 직관적으로 만들 수 있습니다.
URL이 포함 된 패킷의 경우 정규화 된 도메인 이름 (예 : M66.NET 으로 교체하는 등)은 테스트를보다 균일하게 만들 수 있습니다.
이러한 디버깅 기술을 마스터 한 후 올바른 이진 데이터 프로토콜을 작성하는 것이 훨씬 쉽습니다.