A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宏博 中级黑马   /  2017-3-21 17:53  /  1235 人查看  /  13 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

我打算要存储一个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());
        }

}

13 个回复

倒序浏览
用正则表达式,一切都解决了。
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
zlwxf 发表于 2017-3-21 19:02
用正则表达式,一切都解决了。

请问可以具体说一下吗。。。谢谢
回复 使用道具 举报
宏博 发表于 2017-3-28 09:57
请问可以具体说一下吗。。。谢谢

你还没学??
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
写的很详细!似懂非懂。
回复 使用道具 举报

我只知道用正则模式匹配手机号。。不知道怎样减少储存空间。。拜托了
回复 使用道具 举报
3q....我们这群幼小的小黑马...默默的游水中....
回复 使用道具 举报
很赞
回复 使用道具 举报
用正则表达式存储String类型的多好。。
再说不知道你要干嘛。。
存储数据的话用数据库或者xml多好,或者用字节流存储到txt上也行。。
回复 使用道具 举报
直接用char数组,要省就用byte数组,别想这么多,现在不比当年总共一两kb扣着用。
现在就算是五毛钱的单片机也不差你这三五字节空间。
回复 使用道具 举报
回复 使用道具 举报
liximing2017 发表于 2017-5-7 23:42
用正则表达式存储String类型的多好。。
再说不知道你要干嘛。。
存储数据的话用数据库或者xml多好,或者用 ...

那只是检查,但并不能降低存储空间....
回复 使用道具 举报
宏博 发表于 2017-7-21 11:35
那只是检查,但并不能降低存储空间....

其我是想把数据进行一次翻译后再存数据库,这样降低空间,从数据库中取出的数据再经过一次翻译得到想要的数据,其实降低了存储空间,牺牲的运行效率。。。
回复 使用道具 举报
本帖最后由 liximing2017 于 2017-7-22 00:25 编辑
宏博 发表于 2017-7-21 11:35
那只是检查,但并不能降低存储空间....

完全没什么卵用。现在的编程思想是时间更重要,懂吗。。
纯文本数据或者二进制数据一共才几个字节。。
编程的核心是什么?提高效率!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马