文件流的解析过程

在本篇文章开始之前,我们要了解 数组与字符之间的转换(UTF-8编码,32个比特为可转换为一个汉字字符)。

本篇文章是将文件流的解析和转化的过程,思路为以下几点:

1、先将字符串内每个字符转化为int型数字,此时输出编码(完成从字符到数组流的转化)

2、再将int型数组转化为byte型数组(转化为byte万能数组)

3、再将byte型数组转换为int型数组,最后转化为原字符输出(完成从byte万能数组到int编码数组,再到原字符串的转化)

完整版代码如下:

public class FileStream {
    public static void main(String[] args) {

        String str="大家好,你们很棒,你们最好了!";
        byte[] arr=new byte[str.length()*4];//建立byte数组,空间可以容纳4倍的str字符串
        System.out.println("编码转化开始:");
        for(int i=0;i<str.length();i++) {
            char x=str.charAt(i);//将字符串中的每个字符挨个赋值给x
            int w=x;//将x中的字符转化为int型(即,UTF-8编码)
            System.out.println("“"+x+"”"+"字符对应的编码为:"+w+",");//输出转化完成的编码

            //m4~m1方法的作用:将32位的int数,转化为4个8位的byte型数
            arr[i*4]=m4(w);//i*4是为了防止接下来的三次循环覆盖
            arr[i*4+1]=m3(w);
            arr[i*4+2]=m2(w);
            arr[i*4+3]=m1(w);
            //arr数组储存的是什么?字符串先将每个字符转化为int型数字,再将int型数字转化为byte型数,故arr数组内每4个空位存储一个int型数字
        }

        System.out.println("原str字符串的长度为:"+str.length());
        System.out.println("int类型数组的长度(即编码数组长度)为:"+arr.length);
        System.out.println("arr数组:编码格式的str数组:"+arr);

        String m="";
        for(int i=0;i<arr.length;i+=4) {
            int w=m5(new byte[] {arr[i],arr[i+1],arr[i+2],arr[i+3]});
            char x=(char)w;//强制类型转换,将编码转换为字符
            m+=x;//存储到字符串m中
        }

        System.out.println("解析流之后所得:"+m);

    }
    public static byte m1(int x) {
        return (byte)x;//将最右边的8位编码转化为byte型的x
    }
    public static byte m2(int x) {
        x=x>>8;//x右移8位,将第三个8位编码转化为byte型的x
        return (byte)x;
    }
    public static byte m3(int x) {
        x=x>>16;//x右移24位,将第二个8位编码转化为byte型的x
        return (byte)x;
    }
    public static byte m4(int x) {
        x=x>>24;//x右移24位,将最左边的8个编码转化为byte型的x
        return (byte)x;
    }

    public static int m5(byte[] arr) {//将4个byte型数字转化为1个int型数字
        int x=0;
        if(arr[0]>=0)
            x+=arr[0]<<24;
        else
            x+=(arr[0]&255)<<24;//为什么负数的8位二进制数字,与上255之后可以按正数处理?

        if(arr[1]>=0)
            x+=arr[1]<<16;
        else
            x+=(arr[1]&255)<<16;
        if(arr[2]>=0)
            x+=arr[2]<<8;
        else
            x+=(arr[2]&255)<<8;
        if(arr[3]>=0)
            x+=arr[3];
        else
            x+=(arr[3]&255);
        return x;
    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值