현재 위치: > 최신 기사 목록> 이진 데이터로 json_decode ()의 배열 결과를 패키지하십시오

이진 데이터로 json_decode ()의 배열 결과를 패키지하십시오

M66 2025-05-31

PHP 개발에서는 특히 네트워크 전송 또는 파일 스토리지와 관련하여 데이터를 인코딩하고 디코딩해야합니다. JSON_DECODE () 는 JSON 데이터를 PHP 배열 또는 객체에 구문 분석하는 일반적인 기능이며, Pack () 함수는 쉽게 전송 및 스토리지를 위해 이진 문자열에 데이터를 패키지 할 수 있습니다. 이 기사에서는 JSON_DECODE () 에서 얻은 배열 결과를 pack ()를 사용하여 이진 데이터로 포장하는 방법을 자세히 설명합니다.


1. JSON_DECODE () 및 pack () 이해

  • json_decode (String $ json, bool $ assoc = true)
    JSON 문자열을 구문 분석하고 두 번째 매개 변수는 이고 연관 배열을 반환하고 객체는 False 입니다.

  • pack (String $ 형식, 혼합 $ args ...)
    형식 문자를 기반으로 매개 변수를 이진 문자열로 포장하십시오. 형식 문자는 각 매개 변수의 유형과 길이를 결정합니다.

2. 장면 예제

다음 JSON 데이터가 있다고 가정합니다.

 {
  "id": 123,
  "temperature": 36.5,
  "status": 1
}

json_decode ()를 사용하여 배열로 변환 한 후에는 팩 ()을 사용하여 편리한 네트워크 전송을 위해 이진 데이터로 패키지를 만들기를 희망합니다.


3. 샘플 코드 설명

 <?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);
?>

4. 코드 설명

  • N은 변속기 및 크로스 플랫폼에 적합한 32 비트 부호없는 대기업 정수 (Network Endian)를 나타냅니다.

  • F는 32 비트 단일 차량 플로팅 포인트 번호를 나타냅니다.

  • C는 8 비트 부호없는 정수를 나타냅니다.

여기서 ID는 네트워크 엔디 어 정수로 포장되어 있으며 온도 는 부동 소수점 번호이며 상태는 바이트입니다.


5. 이진 데이터의 포장 풀기 예

포장의 정확성을 확인하려면 포장되지 않은 () 함수로 포장을 풀 수 있습니다.

 <?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
)

6.보다 복잡한 JSON 구조를 처리하십시오

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);
?>

7. 요약

  • json_decode () parses json 문자열을 php 어레이로;

  • 팩 ()는 사용자 정의 형식에 따라 데이터를 바이너리로 패키지합니다.

  • 필드 길이와 유형을 고려할 때 형식은 설계해야합니다. 특히 문자열에는 자체 길이 정보가 필요합니다.

  • 데이터의 정확성을 확인하기 위해 포장 () 과 결합합니다.

기능에 대한 자세한 내용의 설명은 공식 PHP 문서를 참조하십시오.