pack () 함수의 기본 구문은 다음과 같습니다.
string pack(string $format, mixed ...$values)
$ 형식 : 형식 문자열. 나중에 전달 된 값의 포장 방법을 정의합니다.
$ 값 : 패키지 할 데이터 목록.
예를 들어, Pack ( 'C', 65)은 ASCII 값이 65 (즉, 문자 A )의 바이트를 반환합니다.
플로팅 포인트 번호의 경우 Pack ()는 두 가지 주요 형식 기호를 제공합니다.
F : 데이터를 32 비트 단일 정밀 부동 소수점 번호 로 패키지하십시오.
D : 데이터를 64 비트 이중 확보 부동 소수점 번호 로 패키지하십시오.
그러나 문제는 - 엔디 니스가 다른 플랫폼에서 다를 수 있다는 것입니다. pack () 에서 접두사별로 바이트 주문을 지정할 수 있습니다.
F / D : 호스트 엔디 니스 사용 (아마도 큰 엔디 언 또는 작은 엔디언)
G : Little Endian Endian Endian 사용 (인텔 아키텍처와 유사)을 사용하는 32 비트 플로팅 포인트 번호
G : Big Endian 바이트 주문 사용 32 비트 플로팅 포인트 번호
E : 64 비트 플로팅 포인트 번호, 리틀 엔디 언트 바이트 순서
E : 64 비트 플로팅 포인트 번호, 빅 엔디 언트 바이트 순서
참고 : G / G / E / E는 PHP 7.0부터 시작되었습니다.
Floating Point 번호 3.14를 네트워크 전송에 필요한 바이너리 스트림으로 패키지 (Big Endian 사용)로 패키지하려고한다고 가정합니다.
<?php
$float = 3.14;
$binary = pack('G', $float); // 빅 엔드로 포장32비트 플로팅 포인트 번호
echo bin2hex($binary); // 출력 16 진수 결과 뷰
?>
출력 (아마도 유사) :
4048f5c3
이 값은 IEEE 754 표준을 지원하는 다른 언어로 3.14로 다시 구문 분석 할 수 있습니다.
Unpack ()를 사용하여 위의 포장 된 값이 정확한지 확인할 수 있습니다.
<?php
$binary = pack('G', 3.14);
$result = unpack('Gfloat', $binary);
echo $result['float']; // 산출 3.14
?>
API를 구축하고 있으며 여러 플로팅 포인트 번호를 패키지하고 업로드해야한다고 가정합니다.
<?php
$data = [1.23, 4.56, 7.89];
$binary = '';
foreach ($data as $num) {
$binary .= pack('G', $num); // 큰 엔디언 형식
}
// 포장 된 데이터를 서버에 업로드하십시오
$url = 'https://m66.net/upload-float-data';
$options = [
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/octet-stream\r\n",
'content' => $binary,
],
];
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
플로팅 포인트 정확도에 대한 요구 사항이 높은 경우 D (64 비트 더블)를 사용하십시오.
플랫폼에서 통신 할 때는 엔디 언을 통합해야하며 G (32 비트 빅 엔디 언) 또는 E (64 비트 빅 엔디안)를 사용하는 것이 좋습니다.
Bin2Hex () 또는 포장을 사용하여 포장 된 결과를 디버깅하십시오.
기본 F 또는 D를 명시 적으로 알지 않고도 기본 F 또는 D 를 사용하지 마십시오.