PHP 개발에서는 특히 네트워크 전송 또는 파일 스토리지와 관련하여 데이터를 인코딩하고 디코딩해야합니다. JSON_DECODE () 는 JSON 데이터를 PHP 배열 또는 객체에 구문 분석하는 일반적인 기능이며, Pack () 함수는 쉽게 전송 및 스토리지를 위해 이진 문자열에 데이터를 패키지 할 수 있습니다. 이 기사에서는 JSON_DECODE () 에서 얻은 배열 결과를 pack ()를 사용하여 이진 데이터로 포장하는 방법을 자세히 설명합니다.
json_decode (String $ json, bool $ assoc = true)
JSON 문자열을 구문 분석하고 두 번째 매개 변수는 참 이고 연관 배열을 반환하고 객체는 False 입니다.
pack (String $ 형식, 혼합 $ args ...)
형식 문자를 기반으로 매개 변수를 이진 문자열로 포장하십시오. 형식 문자는 각 매개 변수의 유형과 길이를 결정합니다.
다음 JSON 데이터가 있다고 가정합니다.
{
"id": 123,
"temperature": 36.5,
"status": 1
}
json_decode ()를 사용하여 배열로 변환 한 후에는 팩 ()을 사용하여 편리한 네트워크 전송을 위해 이진 데이터로 패키지를 만들기를 희망합니다.
<?php
// JSON 데이터
$json = '{"id":123,"temperature":36.5,"status":1}';
// 사용 json_decode 연관 배열로 해결하십시오
$data = json_decode($json, true);
// 분석 결과를 확인하십시오
// var_dump($data);
// 假设데이터格式如下:
// id: 32서명되지 않은 정수 (N)
// temperature: 부동 소수점 번호,32단위 정확도 (f)
// status: 8서명되지 않은 정수 (C)
// 알아채다:pack 지원되지 않습니다 64位부동 소수점 번호格式,只能사용单精度或双精度(d)
// 여기에서 단일 정밀도를 선택하십시오(f)
$binary = pack(
'NfC', // 형식 문자:N - 32비트 엔지니어를위한 서명되지 않은 정수, f - 부동 소수점 번호, C - 8서명되지 않은 정수
$data['id'],
$data['temperature'],
$data['status']
);
// 输出二进制데이터的十六进制表示,보기 쉽습니다
echo bin2hex($binary);
?>
N은 변속기 및 크로스 플랫폼에 적합한 32 비트 부호없는 대기업 정수 (Network Endian)를 나타냅니다.
F는 32 비트 단일 차량 플로팅 포인트 번호를 나타냅니다.
C는 8 비트 부호없는 정수를 나타냅니다.
여기서 ID는 네트워크 엔디 어 정수로 포장되어 있으며 온도 는 부동 소수점 번호이며 상태는 바이트입니다.
포장의 정확성을 확인하려면 포장되지 않은 () 함수로 포장을 풀 수 있습니다.
<?php
// 之前打包后的二进制데이터
$binary = pack('NfC', 123, 36.5, 1);
// 포장 풀기,형식 문자必须与打包时对应
$unpacked = unpack('Nid/ftemperature/Cstatus', $binary);
print_r($unpacked);
?>
산출:
Array
(
[id] => 123
[temperature] => 36.5
[status] => 1
)
JSON에 다차원 배열 또는 문자열이 포함 된 경우 먼저 이진 형식을 설계해야합니다. 일반적인 관행은 다음과 같습니다.
고정 길이 필드는 고정 형식으로 포장됩니다.
문자열은 pack ( 'n', strlen ($ str))과 같은 길이 + 내용으로 포장됩니다. $ str ;
배열 포장 루프.
예:
<?php
$json = '{"users":[{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]}';
$data = json_decode($json, true);
$binary = '';
foreach ($data['users'] as $user) {
$id = $user['id'];
$name = $user['name'];
$nameLen = strlen($name);
$binary .= pack('N', $id); // id 4바이트
$binary .= pack('N', $nameLen); // 이름 길이 4바이트
$binary .= $name; // 이름 문자열
}
echo bin2hex($binary);
?>
json_decode () parses json 문자열을 php 어레이로;
팩 ()는 사용자 정의 형식에 따라 데이터를 바이너리로 패키지합니다.
필드 길이와 유형을 고려할 때 형식은 설계해야합니다. 특히 문자열에는 자체 길이 정보가 필요합니다.
데이터의 정확성을 확인하기 위해 포장 () 과 결합합니다.
팩 기능에 대한 자세한 내용의 설명은 공식 PHP 문서를 참조하십시오.