最近學習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的方式, 這兩個函數在處理網絡傳輸數據時功能強大,后面還要專門研究一下