PHP 字符串和字節序列互相轉換 []byte<=>string


最近學習golang,發現字節數組 []byte 用的很多,但是在PHP中卻很少看到,我就在想PHP中如何實現字節數組和字符串的轉換,
一番試驗下來發現方法還挺多的,記錄一下
方法都很簡單,直接看代碼就行了

<?php

function test()
{
    //測試數據
    $testData = ["你好", "abc"];
    foreach ($testData as $bin) {
        $byte1 = tobyte3($bin);
        $byte2 = tobyte2($bin);
        $byte3 = tobyte1($bin);

        echo 'tobyte1: [' . implode(",", $byte1) . ']' . PHP_EOL;
        echo 'tobyte2: [' . implode(",", $byte2) . ']' . PHP_EOL;
        echo 'tobyte3: [' . implode(",", $byte3) . ']' . PHP_EOL;

        echo 'unbyte1: ' . unbyte1($byte1) . PHP_EOL;
        echo 'unbyte2: ' . unbyte2($byte2) . PHP_EOL;
        echo 'unbyte3: ' . unbyte3($byte3) . PHP_EOL;
    }
}

function tobyte1($str)
{
    return unpack("C*", $str);
}

function tobyte2($str)
{
    $res = [];
    //$len = mb_strlen($str, "8bit"); //這個方法也可以
    $len = strlen($str);
    for ($i = 0; $i < $len; $i++) {
        $res[] = ord($str[$i]);
    }
    return $res;
}

function tobyte3($str)
{
    $hex = bin2hex($str);
    $res = str_split($hex, 2);
    foreach ($res as &$re) {
        $re = hexdec($re);
    }
    unset($re);
    return $res;
}

function unbyte1($bytes)
{
    return pack("C*", ...$bytes);
}

function unbyte2($bytes)
{
    $str = "";
    foreach ($bytes as $byte) {
        $str .= chr($byte);
    }
    return $str;
}

function unbyte3($bytes)
{
    $str = "";
    foreach ($bytes as $byte) {
        $str .= dechex($byte);
    }
    return hex2bin($str);
}

//運行測試
test();

//輸出結果

// tobyte1: [228,189,160,229,165,189]
// tobyte2: [228,189,160,229,165,189]
// tobyte3: [228,189,160,229,165,189]
// unbyte1: 你好
// unbyte2: 你好
// unbyte3: 你好
// tobyte1: [97,98,99]
// tobyte2: [97,98,99]
// tobyte3: [97,98,99]
// unbyte1: abc
// unbyte2: abc
// unbyte3: abc

tobyte 方法 將字符串轉為字節序列 對應 golang 里面的 []byte("xxxx")
unbyte 方法將字節序列轉字符串 對應 golang 里面的 string([]byte{})

上面三種方法中,我推薦使用pack和unpack的方式, 這兩個函數在處理網絡傳輸數據時功能強大,后面還要專門研究一下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM