最近项目中碰到需要把接收十六进制的数据,十六进制的数据不便阅读
方法一,只是不同的函数
// 十六进制转字符串
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";
结果