云迈博客

您现在的位置是:首页 > 后端开发 > PHP > 正文

PHP

【PHP VS Python】字节流与多进制转换

wsinbol2020-12-25PHP364
最近在做一些物联网相关的东西,需要在字节流与各种进制之间转换,着实踩了不少坑。˃PHP世界里极少出现“字节(流)”的概念:没有byte关键字(当然也没有char),官方文档也没提字

最近在做一些物联网相关的东西,需要在字节流与各种进制之间转换,着实踩了不少坑。

PHP 世界里极少出现 “字节 (流)” 的概念:没有 byte 关键字(当然也没有 char),官方文档也没提字节;没有原生的数组支持(常用的 array 其实是 hashtable );当然字符串 (string) 能表达其他语言中的字节数组 (Byte Array, byte [] )

所以在PHP眼中,其他的数据类型都用string或array来构造。尤其是一些透传数据,必须要将字节流做一些转换。相较于PHP版本的转换,还需要自己写函数来实现,Python语言的就省事多了,只需要 hex 方法就可以做到。另外,在涉及到 base64加密 的相关函数,发现 java 的 base64 科技对字节数组进行加密,但 php 只能对字符串加密,它不接受以数组的形式传递参数。。。

PHP 版本

<?php

/**
 * @param string $str   [待处理字符串] 
 * @param boolean $encode [字符串转换为ASCII|ASCII转换为字符串] 
 * @param string $intType [2,8,16进制标示] 
 */

function strtoascii($str, $encode=true, $intType="2"){  
    if($encode == true){  
        $byte_array = str_split($str);
        foreach($byte_array as &$value){  
            $value = ord($value);  
            switch ($intType) {  
                case 16:  
                $value = sprintf("%02x", $value);  
                break;  
                case 8:  
                $value = sprintf("%03o", $value);  
                break;  
                default:  
                $value = sprintf("%08b", $value);  
                break;  
            }  
        }  
        unset($value);  
        $byte_str = implode('', $byte_array);  
    }else{

        $chunk_size = $intType == 16 ? 2 : ($intType == 8 ? 3 : 8);  
        $byte_array = chunk_split($str, $chunk_size);  
        $byte_array = array_filter(explode("\r\n", $byte_array));  
        foreach($byte_array as &$value){  
            $fun_name = $intType == 16 ? 'hexdec' : ($intType == 8 ? 'octdec' : 'bindec');  
            $value = $fun_name($value);  
            $value = chr($value);  
        }  
        unset($value);  
        $byte_str = implode('', $byte_array);  
    }

    return $byte_str;  
}

$str = 'nice to meet you';
$str16 = strtoascii($str, true, 16);
echo $str16;
echo "\n";
echo strtoascii($str16,false,16);

Python 版本

import requests
r = requests.get('http://www.baidu.com')
content = r.content //以字节的方式访问请求响应体
print(content.hex()) // 将字节流转为16进制

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~