最近项目中碰到需要把接收十六进制的数据,十六进制的数据不便阅读
方法一,只是不同的函数
// 十六进制转字符串
function hexToStr($hex)
{$hex = str_replace(' ', '', $hex); // 去除空格$string = '';for ($i = 0; $i < strlen($hex) - 1; $i += 2) {$string .= chr(hexdec($hex[$i] . $hex[$i + 1]));}return $string;
}// 字符串转十六进制
function strToHex($str){$hex='';for ($i=0; $i < strlen($str); $i++){$hex.= dechex(ord($str[$i]));}return $hex;
}// 使用
// 假设从下位机接收到的十六进制数据存储在$hexData变量中
$hexData = "7b0a 2020 226d 7367 223a 2022 6865 6c6c 6f20 7869 616f 7775 3131 2022 0a7d";
// 转换为字符串
$str = hexToStr($hexData);
echo $str . "\n";
echo $hexData = strToHex(json_encode($str)). "\n";
$str = hexToStr($hexData);
echo $str . "\n";
结果
方法二(调用的函数不一样)
/*** 将字符(包括汉字) 转换成16进制* @param $str* @return string*/
function getStrHex($str)
{$str_hex = "";for ($i = 0; $i < strlen($str); $i++) {// ord — 转换字符串第一个字节为 0-255 之间的值$hex = base_convert(ord(substr($str, $i, 1)), 10, 16);if ($hex != "0")$str_hex = $str_hex . $hex;}return $str_hex;
}/*** 将16进制转换成字符(包括汉字)* utf-8* @param $str_hex* @return string*/
function getStrDec($str_hex)
{// 去除空格$str_hex = str_replace(' ', '', $str_hex);$arr = str_split($str_hex, 2);$str = '';for ($i = 0; $i < count($arr); $i++) {if ($arr[$i] != '00') {// chr — 从数字生成单字节字符串$s = chr(base_convert($arr[$i], 16, 10));$str = $str . $s;}}return $str;
}// 假设从下位机接收到的十六进制数据存储在$hexData变量中
$hexData = "7b0a 2020 226d 7367 223a 2022 6865 6c6c 6f20 7869 616f 7775 3131 2022 0a7d ";
echo $str = getStrDec($hexData) . "\n";
echo $hexData = strToHex(json_encode($str)). "\n";
echo $str = getStrDec($hexData) . "\n";
结果