QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3305|回复: 20

Java下如何将byte[]按自定义编码转换成String?

[复制链接]
发表于 2004-10-25 20:00:26 | 显示全部楼层 |阅读模式
我想用MD5来生成密码,但是因为32位太长,所以我想用以下的编码方式把MD5码转成一个21位的字符串:[0-9]、[a-z]、[A-Z]、#、*共64个符号,每6bit转换为一个符号,6bit*21共126bit,原MD5 SUM的最后两bit抛弃掉,但不知道该怎么实现,请各位兄弟姐妹帮忙。
 楼主| 发表于 2004-10-26 13:43:47 | 显示全部楼层
居然没有人鸟我,郁闷!
回复

使用道具 举报

发表于 2004-10-26 14:21:17 | 显示全部楼层
java.util.BitSet?

这个东西在c语言下很简单,在java下不知道有什么方便的类没有,否则你就得一个bit一个bit的往上设了。
回复

使用道具 举报

 楼主| 发表于 2004-10-26 19:03:57 | 显示全部楼层
我到是有另外的想法:每次读三个byte,输出四个符号,但是不知道要怎么实现。
回复

使用道具 举报

 楼主| 发表于 2004-10-27 19:43:50 | 显示全部楼层
还是没有人鸟我…………


我自己有个这样的想法:把三个byte串成一个int(INT=byte*65536+byte[++i]*256+byte[++i]),然后用这个int做index在一个String[]里搜,然后再串到一个StringBuffer里,都做完了后就把这个StringBuffer转成String输出或者直接输出。但是我总觉得这样性能差,浪费空间大,而且还难写(我居然还得构造一个多达16777216项的String[],)但就是想不到还有什么别的方法,大家就帮个忙吧。
回复

使用道具 举报

发表于 2004-10-28 14:03:37 | 显示全部楼层
Java的干活要问myong了。
回复

使用道具 举报

 楼主| 发表于 2004-10-28 18:06:18 | 显示全部楼层
可是myong教兽在哪儿呢?
回复

使用道具 举报

发表于 2004-10-28 22:15:30 | 显示全部楼层
[code:1]
if (!in水园)
   cout << "Must be in the bed with some girls.";
[/code:1]
      
回复

使用道具 举报

发表于 2004-10-28 22:33:30 | 显示全部楼层
[quote:51e4cb2485="Alex_Sune"]还是没有人鸟我…………


我自己有个这样的想法:把三个byte串成一个int(INT=byte*65536+byte[++i]*256+byte[++i]),然后用这个int做index在一个String[]里搜,然后再串到一个StringBuffer里,都做完了后就把这个StringBuffer转成String输出或者直接输出。但是我总觉得这样性能差,浪费空间大,而且还难写(我居然还得构造一个多达16777216项的String[],)但就是想不到还有什么别的方法,大家就帮个忙吧。[/quote]

java不允许对byte做操作,这才是最麻烦的,看来没有什么简单方法。
回复

使用道具 举报

 楼主| 发表于 2004-10-29 13:38:10 | 显示全部楼层
会吗?我做过,可以的,不过要做强制类型转换,不过无所谓。随手乱写了点代码测试了一下,运行正常。[code:1]public class Testing {

        /**
         *
         */
        public Testing() {
                super();
                // TODO 自动生成构造函数存根
        }

        public static void main(String[] args) {
               
                byte[] by = {12,127,0,22,24,56,29,95};
                int in;
                for (int i=0;i<by.length;i++){
                        in = (int)(by[i]);
                        System.out.print(in);
                        System.out.print(" , ");
                }
        }
}
[/code:1][code:1]public class Testing {

        /**
         *
         */
        public Testing() {
                super();
                // TODO 自动生成构造函数存根
        }

        public static void main(String[] args) {
               
                byte[] by = {12,127,0,22,24,56,29,95};
                int in;
                for (int i=0;i+1<by.length;i++){
                        in = by[i]*33+by[i+1]*11;
                        System.out.print(in);
                        System.out.print(" , ");
                }
        }
}
[/code:1]
回复

使用道具 举报

发表于 2004-10-29 14:24:14 | 显示全部楼层
我的意思不是说做加减乘除,而是位移动和位操作。例如<<,& 这样的操作。

你想压缩东西进byte中去,当然需要上面那样的位操作才行。
回复

使用道具 举报

 楼主| 发表于 2004-10-29 18:34:30 | 显示全部楼层
事实证明:<<、>>、&这三个操作可用
回复

使用道具 举报

发表于 2004-10-29 19:23:56 | 显示全部楼层
[quote:f1bd89c83e="Alex_Sune"]事实证明:<<、>>、&这三个操作可用[/quote]

事实证明我的jdk1.4.2就是不能对byte用上述操作,一编译就报一个精度丢失的错误。

今天上班闲,写了个解决方案,当然,例如"a"的ascii值是大于64的,不能直接转换,必须另作一张转换表,所以,我的程序只不过是个演示如何把6bit长的字符压缩填如byte矩阵里。
[code:1]
import java.lang.*;
import java.util.*;

class String6 {
        byte[] str6;
        public String6 (String str8) {
                convert (str8);
        }

        public void convert (String str8) {
                int i, j;
                int p, m;
                char[] str8c = str8.toCharArray();
                str6 = new byte[str8.length()*8/6+1];
                p = m = 0;
                for (j=0,i=0; i<str8c.length; i++) {
                        p = (int) str8c[i];
                        p = p & 0x3f;
                        System.out.println ("str8["+i+"]="+p);
                        switch (i%4)
                        {
                        case 0:
                                m = p << 2;
                                System.out.println ("strm["+i+"]="+String.valueOf (m));
                                break;
                        case 1:
                                m = m | (p>>4);
                                str6[j] = (byte)m; j++;
                                System.out.println ("strm["+i+"]="+String.valueOf (m));
                                System.out.println ("str6["+(j-1)+"]="+str6[j-1]);
                                m = (p << 4)&0x3f;
                                break;
                        case 2:
                                m = m | (p>>2);
                                str6[j] = (byte)m; j++;
                                System.out.println ("strm["+i+"]="+String.valueOf (m));
                                System.out.println ("str6["+(j-1)+"]="+str6[j-1]);
                                m = (p << 6)&0x3f;
                                break;
                        case 3:
                                m = m | p;
                                str6[j] = (byte)m; j++;
                                System.out.println ("strm["+i+"]="+String.valueOf (m));
                                System.out.println ("str6["+(j-1)+"]="+str6[j-1]);
                                m = 0;
                                break;
                        }
                }
                if (m != 0){
                        str6[j] = (byte)m; j++;
                }
        }

        public static void main (String args[]) {
                String6 str6 = new String6("abcdefghijklmn");
        }
}
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2004-10-29 19:43:35 | 显示全部楼层
老大,你这个方案好象反了吧?我的问题是我现在有一个byte[16]共计128bits(八个bits都是有值的),要把他分割成一个每byte只有6bits(前两bits都为零)的byte[21]共计126bits
回复

使用道具 举报

发表于 2004-10-29 19:56:35 | 显示全部楼层
[quote:cfc993c6c0="Alex_Sune"]老大,你这个方案好象反了吧?我的问题是我现在有一个byte[16]共计128bits(八个bits都是有值的),要把他分割成一个每byte只有6bits(前两bits都为零)的byte[21]共计126bits[/quote]

呵呵,那是你的开始时说的不清楚啊。
不过,反了归反了,但是你仔细想想,难道我的程序就不能修改一下满足你的要求?毕竟我只是说一个方案,具体怎么写还得是你自己啊。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 05:23 , Processed in 0.048253 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表