PHP에서 소켓 통신을 수행 할 때 특히 특정 이진 형식으로 데이터를 전송 해야하는 경우 패키지 (캡슐화) 및 데이터를 풀어야하는 상황이 종종 발생합니다. 팩 () 함수는이 문제를 해결하는 무기입니다. 이 기사는 간단한 예제를 결합하여 소켓 통신에서 Pack () 함수의 특정 사용법을 설명합니다.
Pack () 는 PHP의 내장 기능으로 지정된 형식에 따라 데이터를 이진 문자열로 패키지 할 수 있습니다. 이러한 방식으로, 처리 된 데이터는 더 작고 네트워크에서 전송하기에 편리합니다.
기본 구문은 다음과 같습니다.
string pack ( string $format , mixed $args [, mixed $... ] )
$ 형식은 정수, 문자, 부동 소수점 등과 같은 포장 규칙을 정의하는 형식 문자열입니다.
후속 매개 변수는 해당 형식의 데이터입니다.
소켓 통신 중에 데이터는 바이트 스트림으로 전송됩니다. 다른 기계의 엔지니어는 다를 수 있으며 텍스트 또는 일반 데이터를 직접 보내면 수신기가 구문 분석 오류가 발생할 수 있습니다.
Pack ()를 사용하여 :
전송 및 수신 종료의 형식이 일관되도록하기 위해 고정 형식으로 데이터를 인코딩합니다.
Endianness 문제를 처리합니다 (Big Endian, Little Endian).
쉽게 전송 및 구문 분석을 위해 고정 된 길이의 이진 데이터를 생성합니다.
TCP 소켓을 통해 데이터 패킷을 보내려고한다고 가정하면 형식은 다음과 같습니다.
전지 | 유형 | 설명 |
---|---|---|
패키지 길이 | 서명되지 않은 짧은 (2 바이트) | 패키지 길이 필드 자체를 제외하고 패키지 길이 |
명령 번호 | 서명되지 않은 짧은 (2 바이트) | 명령 ID |
데이터 | 끈 | 특정 콘텐츠 |
<?php
// 보낸 데이터 시뮬레이션
$command = 1001;
$data = "Hello, socket communication!";
// 데이터 길이를 계산하십시오
$dataLen = strlen($data);
// 패키지의 길이는 명령 번호 길이입니다. + 데이터 길이 (2 + $dataLen)
$packetLen = 2 + $dataLen;
// 사용 pack 패키지 길이 및 명령 번호(사용网络字节序,빅 엔디언)
$header = pack('n', $packetLen) . pack('n', $command);
// 완전한 패키지 스 플라이 싱
$packet = $header . $data;
// 그것이 확립되었다고 가정합니다 socket 연결하다,socket_write 데이터를 보냅니다
// socket_write($socket, $packet, strlen($packet));
echo "发送的二进制데이터 길이: " . strlen($packet) . "\n";
echo "이진 데이터16카테고리 표현: " . bin2hex($packet) . "\n";
?>
pack ( 'n', $ packetlen)은 서명되지 않은 짧은 정수 (2 바이트) 및 네트워크 엔지니어 (Big Endian)에 $ packetlen을 포장하는 것을 의미합니다.
팩 ( 'n', $ command) 마찬가지로 명령 번호를 포장하십시오.
스 플라이 싱 후 패키지는 데이터 컨텐츠를 따릅니다.
데이터를 수신 한 후에는 다음과 같이 구문 분석 할 수 있습니다.
<?php
// 가정 $recvData 예 socket 이진 데이터를 읽으십시오
// 예를 들어: $recvData = socket_read($socket, 1024);
// 먼저 패키지 길이와 명령 번호를 구문 분석합니다
$header = substr($recvData, 0, 4);
list($packetLen, $command) = array_values(unpack('npacketLen/command', $header));
// 데이터 내용을 추출하십시오
$data = substr($recvData, 4, $packetLen - 2);
echo "패키지 길이: $packetLen\n";
echo "명령 번호: $command\n";
echo "데이터 컨텐츠: $data\n";
?>
PACK () 기능은 이진 데이터 포장을위한 강력한 도구이며 다양한 네트워크 프로토콜 및 이진 파일 작업에 적합합니다.
소켓 통신에서 Pack () 의 합리적인 사용은 일관된 데이터 형식과 안정적인 통신을 보장 할 수 있습니다.
Unpack () 함수와 결합하여 이진 데이터 구문 분석을 쉽게 수행 할 수 있습니다.
Endianness 문제에 특별한주의를 기울이십시오. 네트워크 커뮤니케이션은 일반적으로 네트워크 엔지니어 (Big Endianness)를 채택하며 'N' 형식을 사용하여 짧은 정수를 포장하는 것이 가장 일반적입니다.
이진 프로토콜을 기반으로 네트워크 통신을 수행하는 경우 Pack () 및 Unpack ()를 더 연습하는 것이 좋습니다. 이는 패킷을 처리하는 능력을 크게 향상시킬 수 있습니다.