我打算要存储一个11位的电话号码,可是long是不够长度的,浮点数是不准确的,于是我想用一个字符串String来存,但是为了保存存储量越小,我就得重新封装一下,把这个字符串装换成字节数组,(都知道Java中的所有东西都是以二进制方式存储的),所以我决定把他们重新编码,怎嘛编码呢。(0到9的二进制存储多占用4bit,于是我决定用一个6字节的字节数组存贮,用第一个字节的低4位存储第一位号码,用第一个字节的高4位存储第二个电话号码)于是就有了下面的代码,可是把电话号码存进去后再取出来就乱码了。。。。最后知道 ‘1’是49也就是0011 0000,所以要在字符1的基础上再减48,后再按下面的方式封装,最后取出来的话就按先加48再按取得方式。有兴趣的可以在我基础上按照我的思路改了,动手提升一下。这样就没有错了,最主要的是如果按照原来的方式要11t,现在只需要6t。。。是不是节约了好多空间。。。。
学无止境。。。没有最好的,只有更好的。。。坐等大神指教
package test;
import java.io.UnsupportedEncodingException;
public class ph {
byte[] storage=new byte[6];
byte[]temp=new byte[11];
byte[]temp1=new byte[11];
public void toStorage(String ph){
temp=ph.getBytes();
System.out.println(temp);
String a = null;
try {
a = new String(temp,"gbk");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(a);
for(int i=0,j=0;i<11;i++){
if(i%2==0){
storage[j]=(byte)(temp[i]&0xff);
}else{
storage[j]=(byte)((byte)(temp[i]<<4)|storage[j]);
j++;
}
}
}
public String getStorage(){
for(int i=0,j=0;j<11;j++){
if(j%2==0){
temp1[j]=(byte)(storage[i]&0xff);
}else{
temp1[j]=(byte)((storage[i]>>4)&0xff);
i++;
}
}
System.out.println(temp1);
String a = null;
try {
a = new String(temp1,"gbk");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return a;
}
}
package test;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
ph test=new ph();
test.toStorage("12345678901");
System.out.println(test.getStorage());
}
}
|
|