zoukankan      html  css  js  c++  java
  • php解析处理java的btye字节;php解析处理java的ByteArrayOutputStream字节流/数据流

    php解析处理java的btye字节;php解析处理java的ByteArrayOutputStream字节流/数据流

    一般java的字节流: 就是t

    public class Test {
    
        public static void main(String[] args) {
            String s = "好好学习,天天向上";
            byte[] b = s.getBytes();
            ByteArrayInputStream bai = new ByteArrayInputStream(b);
            ByteArrayOutputStream bao = new ByteArrayOutputStream();
            int t = bai.read();
            while (t != -1) {
                bao.write(t);
                t = bai.read();
            }
            System.out.println(bao);// 调用toString的方法
        }
    }
    

    PHP是弱类型语言,不像java 有这么多数据类型。这里要讲到的就是一个byte

    大家知道在java中把字符串变成byte数组很简单,譬如

    String a=”你好”;

    byte[] bb = a.getBytes(“UTF-8”);  //注意编码

    在PHP中并没有直接的函数,如果在PHP中需要把字符串变成类似byte数组需要这样

    function getBytes($string) {  
            $bytes = array();  
            for($i = 0; $i < strlen($string); $i++){    //遍历每一个字符 用ord函数把它们拼接成一个php数组
                 $bytes[] = ord($string[$i]);  
            }  
            return $bytes;  
        } 

    ord函数是干球用的?

    ord() 函数返回字符串第一个字符的 ASCII 值

    同样把刚才生成的数组再恢复过去可以这么干

    function toStr($bytes) {  
            $str = ”;  
            foreach($bytes as $ch) {  
                $str .= chr($ch);    //这里用chr函数
            }  
               return $str;  
        }  
    chr函数是干球用的?

    chr() 函数从指定的 ASCII 值返回字符。 这个函数正好和ord相反

    好,问题又来了。 在java 中可以把一个十进制数字强制转换为byte型。譬如

    (byte)227  .这个值是:-29 。 (在java中把227强制转换为227只要一句话,So easy。 但这些正是像php这样语言的弱项。也许作者并不希望大家用php完成一些“匪夷所思的功能”,做网站就老老实实做网站,玩啥byte啊)

    大家如果做过各种第三方平台的token验证等功能可能会用到。这里先解释一下java 在做 byte强制转换时的一些过程(由于太懒,其过程从百度里抄抄弄弄的,懒得写)

    扫盲开始:

    1、因为byte占8个bit位.int占32个bit位,将int转成byte相当与强制截取int的二进制数的后8位,由于多余的部分byte空间装不下,因此干掉多余部分,取其后8位b位 转成10进制的值就是结果,

    2、如果截下来的8位数的第一位(从左往右,术语叫做高位)是1,表示此数是负数,那么最终的结果就是 把这8位先转为十进制数然后再减去256就是最终的值

    3、相反如果高位是0,代表正数,那么直接把这8位转为十进制数就是这个byte货色的结果

    那么在php中怎么实现呢?其实了解原理和掌握几个函数后就能自己来完成

    function toByte($num) //$num 可以传数字
    {
        $num=decbin($num);  //decbin 是php自带的函数,可以把十进制数字转换为二进制

        $num=substr($num,-8); //取后8位
        $sign=substr($num,0,1); //截取 第一位 也就是高位,用来判断到底是负的还是正的
        if($sign==1)  //高位是1 代表是负数 ,则要减去256
        {
            return bindec($num)-256; //bindec 也是php自带的函数,可以把二进制数转为十进制
        }
        else
        {
            return bindec($num);
        }
    }

    大家可以分别在php和java中测试一下。 toByte(227) 和java中的 (byte)227 是否一样呢?

    如果大家在开发一些BAT的各种无节操的API接口,涉及到一些权限验证啥的 都会用到这些玩意儿。

    http://www.hishenyi.com/archives/178

  • 相关阅读:
    P1587 [NOI2016]循环之美 杜教筛
    【学习笔记】省选动态规划类型选讲
    【模板】结构体重载高精度
    SP1716 GSS3
    SP1043 GSS1
    P1890 gcd区间 线段树
    【模板】(最小费用)最大流
    【模板】矩阵乘法
    P1073 最优贸易 DFS
    【2019.8.14】2019QB学堂DP图论班第一次考试 Problem C
  • 原文地址:https://www.cnblogs.com/achengmu/p/9522539.html
Copyright © 2011-2022 走看看