在本篇文章开始之前,我们要了解 数组与字符之间的转换(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;
}
}