>  기사  >  백엔드 개발  >  PHP에서 팩과 언팩을 사용하는 방법

PHP에서 팩과 언팩을 사용하는 방법

小云云
小云云원래의
2018-03-26 14:30:333967검색

PHP에는 pack과 unpack이라는 두 가지 함수가 있습니다. 많은 PHP 사용자는 이를 실제 프로젝트에서 사용한 적이 없으며 이 두 가지 방법이 무엇에 사용되는지조차 모릅니다. 이 기사에서는 주로 PHP에서 pack 및 unpack을 사용하는 방법에 대해 설명합니다. 도움이 되기를 바랍니다.

pack

string pack ( string $format [, mixed $args [, mixed $... ]] )

이 함수는 해당 매개변수($args)를 이진 문자열로 압축하는 데 사용됩니다.

첫 번째 매개변수 $format에는 다음과 같은 옵션이 있습니다(선택적 매개변수가 많이 있으며 일반적으로 사용되는 일부 매개변수는 나중에 설명합니다).
a NUL 바이트를 사용하여 문자열 공백을 채웁니다.
A SPACE(공백)를 사용하여 문자열을 채웁니다.
h 16진수 문자열, 낮은 쪽부터
H 16진수 문자열, 높은 쪽부터
c 부호 있는 문자
C 부호 없는 문자
s 부호 있는 short(16비트, 호스트 바이트 순서)
S Unsigned short(16비트, 호스트 바이트 순서)
n 부호 없는 short(16비트, 빅 엔디안)
v 부호 없는 short(16비트, little endian)
i 부호 있는 정수(기계 종속 바이트 순서)
I 부호 없는 정수(기계 종속 바이트 순서)
l 부호 있는 long(32비트, 호스트 바이트) order)
L Unsigned Long (32비트, 호스트 바이트 순서)
N Unsigned Long Integer (32비트, Big Endian 바이트 순서)
V Unsigned Long Integer (32비트, Little Endian 바이트 순서)
q Signed Long Integer Type (64 비트, 호스트 바이트 순서)
Q 부호 없는 긴 정수형(64비트, 호스트 바이트 순서)
J 부호 없는 긴 정수형(64비트, 빅 엔디안 바이트 순서)
P 부호 없는 긴 정수형(64비트, 리틀 엔디안)
f 단정밀도 부동 소수점(기계에 따라 다름)
d 배정밀도 부동 소수점(기계에 따라 다름)
x NUL 바이트
X 1바이트씩 뒤로 물러남
Z 문자열 공백을 NUL 바이트로 채움(PHP의 새로운 기능) 5.5)
@ NUL을 절대 위치까지 채워넣으세요

처음에 너무 많은 매개변수를 보고 정말 헷갈렸어요. 대부분의 명령어는 이해하기 쉽지만, 호스트, 빅엔디안, 리틀의 바이트 순서는 무엇인가요? 엔디안 등? 다음 내용은 비교적 지루하지만 이해해야 하므로 계속해서 읽어보세요.

엔디안이란 무엇인가요?

就是字节的顺序,说白了就是多字节数据的存放顺序(一个字节显然不需要顺序)。
比如A和B分别对应的二进制表示为0100 0001、0100 0010。对于储存字符串AB,我们可以0100 0001 0100 0010也可以0100 0010 0100 0001,这个顺序就是所谓的字节序。

높은/낮은 바이트

比如字符串AB,左高右低(我们正常的阅读顺序),A为高字节,B为低字节

높은/낮은 주소

假设0x123456是按从高位到底位的顺序储存,内存中是这样存放的:

高地址 -> 低地址12 -> 34 -> 56

빅 엔디안(네트워크 바이트 순서)

大端就是将高位字节放到内存的低地址端,低位字节放到高地址端。网络传输中(比如TCP/IP)低地址端(高位字节)放在流的开始,对于2个字节的字符串(AB),传输顺序为:A(0-7bit)、B(8-15bit)。
那么小端字节序自然和大端相反。

Host endian

表示当年机器的字节序(也就是网络字节序是确定的,而主机字节序是依机器确定的),一般为小端字节序。

a 및 A(팩 문자열, NUL 또는 공백 채우기 사용)

$string = pack('a6', 'china');
var_dump($string); //输出结果: string(6) "china",最后一个字节是不可见的NULecho ord($string[5]); //输出结果: 0(ASCII码中0对应的就是nul)//A同理$string = pack('A6', 'china');
var_dump($string); //输出结果: string(6) "china ",最后一个字节是空格echo ord($string[5]); //输出结果: 32(ASCII码中32对应的就是空格)

PHP에서 팩과 언팩을 사용하는 방법
PHP에서 팩과 언팩을 사용하는 방법

에는 ASCII 테이블이 제공됩니다(man ascii를 사용하여 linux/unix에서 볼 수 있음)

h 및 H

$string = pack('H3', 281);
var_dump($string); //输出结果: string(2) "("for($i=0;$i<strlen($string);$i++) {echo ord($string[$i]) . PHP_EOL;
}//输出结果: 40 16

h 및 H에는 특별한 설명이 필요합니다. 해당 매개변수는 16진수 문자로 처리됩니다. 그런 다음 포장됩니다. 그것은 무엇을 의미합니까? 예를 들어 위의 281은 16진수 1개가 2진수 4개에 해당하기 때문에 패키징하기 전에 0x281로 변환됩니다. 위의 0x281은 1.5바이트에 불과하며 기본적으로 0을 추가하여 0x28에 해당하는 10진수인 0x2810이 됩니다. 40((), 0x10에 해당하는 소수는 16(dle 보이지 않는 문자)입니다. 이해가 안 되시면 메시지 남겨주시면 됩니다.

c 및 C

$string = pack(&#39;c3&#39;, 67, 68, -1);
var_dump($string); //输出:string(3) "CD�"for($i=0;$i<strlen($string);$i++) {
echo ord($string[$i]) . PHP_EOL;
}
//输出: 67 68 225

최종 출력 본능은 67 68 - 1이어야 합니다
ord는 해당 문자(0~255 범위)의 ASCII 코드를 구합니다. 이때 -1(0000 0001)에 해당하는 문자는 보수 형식으로 출력되며, 즉 255(1111 1110 + 0000 0001 = 1111 1111)

정수 유형 관련

모든 정수 유형은 비트 및 바이트 순서에 주의하세요. 다음에서는 L을 예로 들어

$string = pack(&#39;L&#39;, 123456789);
var_dump($string); //输出:string(4) "�["for($i=0;$i<strlen($string);$i++) {
echo ord($string[$i]) . PHP_EOL;
}
//输出: 21 205 91 7

f와 d

$string = pack(&#39;f&#39;, 12345.123);
var_dump($string);//输出:string(4) "~�@F"var_dump(unpack(&#39;f&#39;, $string)); //这里提前用到了unpack,后面会讲解
//输出:float(12345.123046875)

f를 사용합니다. 부동 소수점 숫자 포장 , 포장 전이 12345.123이고 포장을 푼 후가 12345.123046875인 이유는 부동 소수점 숫자 저장과 관련이 있습니다

x, , 투명한 어린이용 신발이 있으면 메시지를 남겨주세요. 감사합니다 .

$string = pack(&#39;x&#39;); //打包一个nul字符串echo ord($string); //输出: 0
$string = pack(&#39;Z2&#39;, &#39;abc5&#39;); //其实就是将从Z后面的数字位置开始,全部设置为nul
var_dump($string); //输出:string(2) "a"for($i=0;$i<strlen($string);$i++) {
echo ord($string[$i]) . PHP_EOL;
}
//输出: 97 0

unpack

$string = pack(&#39;@4&#39;); //我理解为填充N个nulvar_dump($string); //输出: string(4) ""for($i=0;$i<strlen($string);$i++) {echo ord($string[$i]) . PHP_EOL;
}//输出: 0 0 0 0

unpack의 사용법은 매우 간단합니다. pack으로 패키징한 데이터를 언패킹하는 것에 대해서만 설명합니다. 패키징을 풀 때 사용되는 매개변수는 다음과 같습니다. 몇 가지 작은 예

array unpack ( string $format , string $data )

이 두 기능의 용도는 무엇인가요

데이터 통신(바이너리 형식을 통해 다른 언어와 통신)
데이터 암호화(포장 방법을 제3자에게 알려주지 않으면 상대방이 포장을 풀기가 상대적으로 어렵습니다)

공간 절약(예를 들어 상대적으로 큰 숫자를 문자열로 저장하면 공간이 많이 낭비되며 이진 형식으로 패키징하려면 4자리 만 필요합니다.)

관련 권장 사항:

사용에 대한 자세한 설명 포장 및 포장 풀기

위 내용은 PHP에서 팩과 언팩을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.