Pack () 함수는 지정된 형식 문자열과 데이터를 이진 문자열로 패키지합니다. 예를 들어, Pack ( "C", 65)은 ASCII 코드 65 (즉, 문자 "a")가있는 단일 문자를 포함하는 이진 문자열을 반환합니다. 형식 문자열은 데이터의 레이아웃을 설명하는 데 사용됩니다. 일반적인 형식 코드에는 다음이 포함됩니다.
C : 서명되지 않은 문자 (8 비트, 범위 0–255)
N : 서명되지 않은 짧은 정수 (16 비트, 빅 엔디 안 엔디언)
N : 서명되지 않은 긴 정수 (32 비트, 빅 엔디 안 엔디언)
H* : 16 진수 문자열 (높은 비트 우선 순위)
예를 들어:
$bin = pack("C*", 72, 101, 108, 108, 111); // 해당 문자 "Hello"
echo $bin; // 산출 Hello
이 과정은 정수 배열을 압축 이진 문자열로 변환하는 것과 같습니다.
pack () 과 달리 Ord ()는 문자를 해당 ASCII 또는 유니 코드 값으로 변환하는 데 사용됩니다. Pack () 의 "디코더"이며 이진 문자열에서 데이터를 추출 할 때 매우 유용합니다.
예를 들어:
$char = "A";
$ascii = ord($char); // 반품 65
이 기능은 Pack () 와 협력하여 인코딩 된 문자열에서 원래 데이터 바이트를 복원하는 데 매우 적합합니다.
데이터를 이진으로 인코딩 할 때 pack ()를 사용하고 바이너리에서 추출 할 때 ord ()를 사용하십시오. 이것은 둘 사이의 보완 관계를 구성합니다. 예를 들어, 먼저 숫자 시퀀스를 포장 한 다음 바이트 바이트를 구문 분석 할 수 있습니다.
$data = [77, 54, 54];
$bin = pack("C*", ...$data);
// 각 바이트를 읽으십시오
for ($i = 0; $i < strlen($bin); $i++) {
echo ord($bin[$i]) . "\n"; // 산출 77, 54, 54
}
이 코드에서는 팩 ()을 사용하여 배열 [77, 54, 54]을 3 바이트 바이너리 스트링으로 변환하는 반면 ord ()는 바이트별로 원래 숫자 값으로 복원합니다.
이 기술은 특정 프로토콜에 대한 이진 메시지를 구성 할 때 특히 유용합니다. 예를 들어, 다음과 유사한 짧은 링크 요청 패키지를 구성합니다.
$url_id = 1234;
$payload = pack("N", $url_id);
file_put_contents("http://m66.net/api/store", $payload);
서버 가이 4 바이트 데이터를 수신 한 후에는 다음과 같이 구문 분석 할 수 있습니다.
$data = file_get_contents("php://input");
$url_id = unpack("N", $data)[1];
여기서 팩 ( "n", $ url_id) 및 풀 ( "n", $ data) 은 정확히 한 쌍의 보완 작업입니다.
예를 들어, 일종의 경량 암호화 또는 사용자 정의 전송 프로토콜을 구현할 때 텍스트 정보를 숫자 값 바이트로 변환하고 이진에 캡슐화하기 전에 일부 오프셋 처리를 수행해야 할 수도 있습니다.
$text = "Hi!";
$encrypted = "";
for ($i = 0; $i < strlen($text); $i++) {
$encrypted .= pack("C", ord($text[$i]) + 1);
}
// 암호 해독
$decrypted = "";
for ($i = 0; $i < strlen($encrypted); $i++) {
$decrypted .= chr(ord($encrypted[$i]) - 1);
}
echo $decrypted; // 산출 Hi!
이 예에서 Ord ()는 문자를 숫자로 바꾸고 Pack ()는 이진으로 감싸고 ord () 로 암호 해독을 복원 한 다음 오프셋합니다.