PHP 에서 pack,unpack 의 상세 한 용법 에 대하 여 말씀 드 리 겠 습 니 다.

6429 단어 PHPpackunpack
PHP 에는 두 개의 함수 팩 과 unpack 이 있 는데 많은 PHPer 는 실제 프로젝트 에서 사용 한 적 이 없고 심지어 이 두 가지 방법 이 무엇 에 쓰 이 는 지 모른다.이 글 은 그 두 사람 이 도대체 무엇 에 쓰 이 는 지 모두 에 게 소개 한다.
pack

string pack ( string $format [, mixed $args [, mixed $... ]] )
이 함 수 는 대응 하 는 인자($args)를 바 이 너 리 문자열 로 포장 하 는 데 사 용 됩 니 다.
그 중에서 첫 번 째 매개 변 수 는$format 입 니 다.다음 과 같은 옵션 이 있 습 니 다.
Code
Description
a
문자열 공백 을 NUL 바이트 로 채 웁 니 다.
A
문자열 을 SPACE(공백)로 채 웁 니 다.
h
16 진 문자열
H
16 진 문자열
c
부호 문자
C
부호 없 는 문자
s
기호 짧 은 정형(16 비트,호스트 바이트 순서)이 있 습 니 다.
S
부호 없 는 짧 은 정형(16 비트,호스트 바이트 순서)
n
부호 없 는 짧 은 정형(16 비트,큰 바이트 순서)
v
부호 없 는 짧 은 정형(16 비트,작은 바이트 순서)
i
기호 정형(기계 관련 크기 바이트 순서)
I
부호 없 는 정형(기계 관련 크기 바이트 순서)
l
기호 길이 정형(32 비트,호스트 바이트 순서)
L
부호 없 는 긴 정형(32 비트,호스트 바이트 순서)
N
부호 없 는 긴 정형(32 비트,큰 바이트 순서)
V
부호 없 는 긴 정형(32 비트,작은 바이트 순서)
q
기호 길이 정형(64 비트,호스트 바이트 순서)
Q
부호 없 는 길이 정형(64 비트,호스트 바이트 순서)
J
부호 없 는 길이 정형(64 비트,큰 바이트 순서)
P
부호 없 는 길이 정형(64 비트,작은 바이트 순서)
f
단 정밀도 부동 소수점 형(기계 관련 크기)
d
2 정밀도 부동 소수점 형(기계 관련 크기)
x
NUL 바이트
X
바이트 되 돌리 기
Z
문자열 공백 을 NUL 바이트 로 채 우기(new in PHP 5.5)
@
NUL 을 절대 위치 로 채 웁 니 다.
이렇게 많은 매개 변 수 를 보면 저 는 처음으로 진심으로 멍 해 졌 습 니 다.대부분 설명 이 잘 이해 되 지만 그 중의 호스트,큰 끝,작은 끝 등 바이트 순 서 는 무엇 입 니까?다음 내용 은 지루 하지만 이해 해 야 합 니 다.버 텨 보 세 요.
바이트 순서 가 뭐 예요?
바로 바이트 의 순서 입 니 다.말하자면 다 바이트 데이터 의 저장 순서 입 니 다.
예 를 들 어 A 와 B 가 각각 대응 하 는 이 진 은 0100 0001,0100 0010 을 나타 낸다.저장 문자열 AB 에 대해 우 리 는 0100 0001 0100 0010 도 0100 0010 0100 0001 도 할 수 있 습 니 다.이 순 서 는 바로 바이트 순서 입 니 다.
높 음/낮은 바이트
예 를 들 어 문자열 AB,왼쪽 높 고 오른쪽 낮 음(우리 의 정상 적 인 읽 기 순서),A 는 높 은 바이트,B 는 낮은 바이트 이다.
고/저 주소
만약 에 0x 123456 이 높 은 위치 에서 끝까지 의 순서에 따라 저장 된다 고 가정 하면 메모리 에 이렇게 저 장 됩 니 다.
높 은 주소->낮은 주소
12 -> 34 -> 56
큰 바이트 순서(네트워크 바이트 순서)
대 단 은 높 은 비트 바이트 를 메모리 의 낮은 주소 단 에 두 고 낮은 비트 바이트 를 높 은 주소 단 에 두 는 것 이다.네트워크 전송 에서(예 를 들 어 TCP/IP)저 주소 단(고위 바이트)은 흐름 의 시작 에 두 고 2 바이트 의 문자열(AB)에 대해 전송 순 서 는 A(0-7bit),B(8-15bit)이다.
그러면 작은 바이트 순 서 는 자 연 스 럽 게 큰 끝 과 반대 된다.
호스트 바이트 순서
그 당시 기계 의 바이트 순서(즉,네트워크 바이트 순 서 는 확정 되 었 고 호스트 바이트 순 서 는 기계 에 의 해 확정 되 었 음)를 나타 내 며 보통 작은 바이트 순서 이다.
a 와 A(문자열 을 포장 하고 NUL 또는 빈 칸 으로 채 웁 니 다)

$string = pack('a6', 'china');
var_dump($string); //    : string(6) "china",           NUL
echo 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       )

ASCII 표 한 장 첨부(linux/unix 에서 man ascii 로 볼 수 있 음)
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 은 포장 하기 전에 281 을 0x 281 로 바 꿉 니 다.16 진법 에 대응 하 는 4 자리 가 있 기 때문에 위의 0x 281 은 1.5 바이트 만 있 고 그 다음 에 0 을 0x 2810 으로 바 꿉 니 다.0x 28 에 대응 하 는 10 진법 은 40()이 고 0x 10 에 대응 하 는 10 진법 은 16(dle 보이 지 않 는 문자)입 니 다.아 시 겠 죠?모 르 겠 어 요.메 시 지 를 남 겨 주세요.
c 와 C

$string = pack('c3', 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 는 문자 의 ASCII 코드(범위 0-255)를 가 져 왔 습 니 다.이때-1(0000 0001)에 대응 하 는 문 자 는 보충 코드 로 255(1111 1110+0000 0001=1111 1111)를 출력 합 니 다.
정형 상관
모든 정형 유형의 사용 방법 은 똑 같 습 니 다.주로 그들의 위치 와 바이트 순 서 를 주의 하면 됩 니 다.다음은 L 을 예 로 들 어 보 여 드 리 겠 습 니 다.

$string = pack('L', 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('f', 12345.123);
var_dump($string);
//  :string(4) "~�@F"
var_dump(unpack('f', $string)); //       unpack,     
//  :float(12345.123046875)
f 와 d 는 부동 소수점 에 대한 포장 입 니 다.왜 포장 하기 전에 12345.123 으로 가방 을 풀 었 는 지 에 대해 서 는 12345.12346875 입 니 다.이것 은 부동 소수점 저장 과 관계 가 있 습 니 다.그 다음 에 하나의 글 을 열 어 IEEE 기준 을 설명 할 수 있 습 니 다.
x、X、Z、@

$string = pack('x'); //    nul   
echo ord($string); //  : 0
X(대문자 X)에 대해 N 번 해 봤 는데 어떻게 쓰 는 지 모 르 겠 어 요.정확 한 어린이 신발 이 있 으 면 메 시 지 를 남 겨 주세요.감사합니다.

$string = pack('Z2', 'abc5'); //      Z         ,     nul
var_dump($string); //  :string(2) "a"

for($i=0;$i<strlen($string);$i++) {
echo ord($string[$i]) . PHP_EOL;
}
//  : 97 0

$string = pack('@4'); //      N nul
var_dump($string); //  : string(4) ""

for($i=0;$i<strlen($string);$i++) {
echo ord($string[$i]) . PHP_EOL;
}
//  : 0 0 0 0
unpack

array unpack ( string $format , string $data )
unpack 의 사용 은 상당히 간단 합 니 다.즉,pack 포장 의 데이터 패 키 지 를 풀 고 포장 할 때 사용 하 는 매개 변 수 는 어떤 매개 변수 로 패 키 지 를 풀 고 구체 적 으로 사용 하기 귀 찮 습 니 다.몇 가지 작은 예 를 들 어 보 겠 습 니 다.

$string = pack('L4', 1, 2, 3, 4);
var_dump(unpack('L4', $string));
//  :
array(4) {
[1]=>
int(1)
[2]=>
int(2)
[3]=>
int(3)
[4]=>
int(4)
}

$string = pack('L4', 1, 2, 3, 4);
var_dump(unpack('Ll1/Ll2/Ll3/Ll4', $string)); //    key, /  
//  :
array(4) {
["l1"]=>
int(1)
["l2"]=>
int(2)
["l3"]=>
int(3)
["l4"]=>
int(4)
}
이 두 함 수 는 도대체 무슨 용도 가 있 습 니까?
  • 데이터 통신(바 이 너 리 형식 을 통 해 다른 언어 와 통신)
  • 데이터 암호 화(제3자 에 게 당신 의 포장 방식 을 알려 주지 않 으 면 상대방 이 가방 을 풀 기 가 상대 적 으로 어렵 습 니 다)
  • 공간 절약(예 를 들 어 비교적 큰 숫자 는 문자열 에 따라 저장 하면 많은 공간 을 낭비 하고 이 진 형식 으로 포장 해 야 4 자리<32 자리 숫자>)
  • 이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기