기타 pack

(PHP 4, PHP 5, PHP 7, PHP 8)

pack — 데이터를 이진 문자열로 압축


설명

pack(string $format, mixed ...$values): string

format에 따라 주어진 인수를 이진 문자열로 묶습니다.

이 함수에 대한 아이디어는 Perl에서 가져왔으며 모든 형식 지정 코드는 Perl에서와 동일하게 작동합니다. 그러나 Perl의 "u" 형식 코드와 같이 누락된 일부 형식 지정 코드가 있습니다.

부호 있는 값과 부호 없는 값의 구분은 unpack() 함수에만 영향을 미치며, 여기서 pack() 함수는 부호 있는 형식 코드와 부호 없는 형식 코드에 대해 동일한 결과를 제공합니다.


매개변수

format
format 문자열은 형식 코드와 선택적 repeater 인수로 구성됩니다. repeater 인수는 정수 값이거나 입력 데이터의 끝까지 반복하기 위한 *일 수 있습니다. A, H, H의 경우 반복 횟수는 한 데이터 인수의 문자 수를 지정하고 @의 경우 다음 데이터를 넣을 절대 위치이며 다른 모든 항목의 경우 반복 횟수는 소비되는 데이터 인수의 수를 지정하고 결과 바이너리 문자열로 압축됩니다.

현재 구현된 형식은 다음과 같습니다.

pack() format characters

Code 설명
a NUL-padded string
A SPACE-padded string
h Hex string, low nibble first
H Hex string, high nibble first
csigned char
C unsigned char
s signed short (always 16 bit, machine byte order)
S unsigned short (always 16 bit, machine byte order)
n unsigned short (always 16 bit, big endian byte order)
v unsigned short (always 16 bit, little endian byte order)
i signed integer (machine dependent size and byte order)
I unsigned integer (machine dependent size and byte order)
l signed long (always 32 bit, machine byte order)
L unsigned long (always 32 bit, machine byte order)
N unsigned long (always 32 bit, big endian byte order)
V unsigned long (always 32 bit, little endian byte order)
q signed long long (always 64 bit, machine byte order)
Q unsigned long long (always 64 bit, machine byte order)
J unsigned long long (always 64 bit, big endian byte order)
P unsigned long long (always 64 bit, little endian byte order)
f float (machine dependent size and representation)
g float (machine dependent size, little endian byte order)
G float (machine dependent size, big endian byte order)
d double (machine dependent size and representation)
e double (machine dependent size, little endian byte order)
E double (machine dependent size, big endian byte order)
x NUL byte
X Back up one byte
Z NUL-padded string
@ NUL-fill to absolute position
values

반환 값

데이터가 포함된 이진 문자열을 반환하거나 실패하면 false를 반환합니다.


변경 로그

버전 설명
8.0.0 이 함수는 더 이상 실패 시 false를 반환하지 않습니다.
7.2.0 float 및 double 유형은 Big Endian과 Little Endian을 모두 지원합니다.
7.0.15,7.1.1 float 및 double에 대한 바이트 순서 지원을 활성화하기 위해 "e", "E", "g" 및 "G" 코드가 추가되었습니다.

Examples

예제 #1 pack() 예제

                  
<?php
$binarydata = pack("nvc*", 0x1234, 0x5678, 65, 66);
?>
                  
                

결과 바이너리 문자열은 길이가 6바이트이고 바이트 시퀀스 0x12, 0x34, 0x78, 0x56, 0x41, 0x42를 포함합니다.


메모

메모:

PHP는 내부적으로 int 값을 기계 종속 크기(C 유형 long)의 부호 있는 값으로 저장합니다. 정수 리터럴 및 int 유형의 범위를 벗어나는 숫자를 생성하는 연산은 float로 저장됩니다. 이러한 부동 소수점을 정수로 패킹할 때 먼저 정수 유형으로 캐스트됩니다. 이로 인해 원하는 바이트 패턴이 생성되거나 되지 않을 수 있습니다.

가장 관련성이 높은 경우는 int 유형이 unsigned인 경우 표현할 수 있는 unsigned 숫자를 패킹할 때입니다. int 유형이 32비트 크기를 갖는 시스템에서 캐스트는 일반적으로 int가 unsigned인 것처럼 동일한 바이트 패턴을 생성합니다(이는 C 표준에 따라 구현에 정의된 unsigned에서 서명된 변환에 의존하지만). int 유형이 64비트 크기를 갖는 시스템에서 float에는 정밀도 손실 없이 값을 보유할 만큼 충분히 큰 가수가 없을 가능성이 큽니다. 해당 시스템에 기본 64비트 C int 유형이 있는 경우(대부분의 UNIX 계열 시스템에는 없음) 상위 범위에서 I pack 형식을 사용하는 유일한 방법은 int 음수 값을 생성하는 것입니다. 원하는 부호 없는 값.


기타

  • unpack() - 바이너리 문자열에서 데이터 압축 풀기