Dim X As Single
    Dim CHARNUM As Long, RANDOMINTEGER As Integer
    Dim SINGLECHAR As String * 1
    Dim strtmp As String
    If MA < 0 Then
    MA = MA * (-1)
    End If
    X = Rnd(-MA)
    For i = 1 To Len(strSource) Step 1
    SINGLECHAR = Mid(strSource, i, 1)
    CHARNUM = Asc(SINGLECHAR)
    
ReRandom:
    RANDOMINTEGER = Int(127 * Rnd)
    
    If RANDOMINTEGER < 30 Or RANDOMINTEGER > 100 Then GoTo ReRandom
    CHARNUM = CHARNUM Xor RANDOMINTEGER
    strtmp = strtmp & Chr(CHARNUM)
    Next i

解决方案 »

  1.   

    X = Rnd(-MA)后面这个 X 就没用到,MA 也没用到,不知道 X 和 MA 在这里起着什么作用!
      

  2.   

    Public Function StringEnDeCodecn(ByVal strSource As String, MA As Long) As String
        
        On Error GoTo ErrEnDeCode
        Dim X As Single
        Dim CHARNUM As Long, RANDOMINTEGER As Integer
        Dim SINGLECHAR As String * 1
        Dim strtmp As String
        If MA < 0 Then
        MA = MA * (-1)
        End If
        X = Rnd(-MA)
        For i = 1 To Len(strSource) Step 1
        SINGLECHAR = Mid(strSource, i, 1)
        CHARNUM = Asc(SINGLECHAR)
        
    ReRandom:
        RANDOMINTEGER = Int(127 * Rnd)
        
        If RANDOMINTEGER < 30 Or RANDOMINTEGER > 100 Then GoTo ReRandom
        CHARNUM = CHARNUM Xor RANDOMINTEGER
        strtmp = strtmp & Chr(CHARNUM)
        Next i
        StringEnDeCodecn = strtmp
        Exit Function
        
    ErrEnDeCode:
        StringEnDeCodecn = ""
        
    End Function
      

  3.   

    VB 中的 Asc 与 Chr 两个函数是基于 GBK 编码的,Java 中没有对应的方法,需要自行实现。
    下面 vbAsc 和 vbChr 两个方法没有完全测试过。import java.io.UnsupportedEncodingException;
    import java.util.Random;public class Test {
        
        public static void main(String[] args) {
            String str = "五笔字型计算机汉字输入技术";
            String s = stringEnDeCodecn(str, 121251L);
            System.out.println(s);
        }
        
        public static String stringEnDeCodecn(String strSource, long ma) {
            if(strSource == null || strSource.length() == 0) {
                return "";
            }
            if(ma < 0) {
                ma = -ma;
            }
            float x = new Random(-ma).nextFloat();
            Random ran = new Random();
            StringBuilder sb = new StringBuilder();
            for(int i = 0; i < strSource.length(); i++) {            
                int randomInteger;
                do {
                    randomInteger = ran.nextInt(127);
                }while(randomInteger < 30 || randomInteger > 100);
                int charNum = vbAsc(strSource.charAt(i));
                charNum ^= randomInteger;
                sb.append(vbChr(charNum));
            }
            return sb.toString();
        }
        
        /**
         * 以 VB 的格式将一个字符转换成数字
          * @param c
         * @return
         */
        private static int vbAsc(char c) {
            if(c < 0xff) {
                return (int)c;
            }
            byte[] bys = null;
            try {
                bys = String.valueOf(c).getBytes("gbk");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            if(bys == null || bys.length < 2) {
                throw new IllegalArgumentException("ERROR! " + c + ", cannot be converted to VB ASCII.");
            }
            return 0xffff0000 | ((bys[0] & 0xff) << 8) | (bys[1] & 0xff);
        }
        
        /**
         * 以 VB 的格式将一个数值转换成字符
          * @param n
         * @return
         */
        private static char vbChr(int n) {
            n &= 0xffff;
            if(n < 0xff) {
                return (char)0xff;
            }
            byte[] bys = new byte[2];
            bys[0] = (byte)((n & 0xff00) >> 8);        
            bys[1] = (byte)(n & 0xff);
            String str = null;
            try {
                str = new String(bys, "gbk");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            if(str == null || str.length() < 1) {
                throw new IllegalArgumentException("ERROR! " + n + ", cannot be converted to a character.");
            }
            return str.charAt(0);
        }
    }
      

  4.   

    6喽的代码还是不对,例如:我输入abc123   返回的结果应该是;:<nrl  这个字符串才对
      

  5.   

    不是  我以前都是一样的  因为这个是异或加密   很好用   可是转向java的我就全是随机的了 
    函数调用参数我给你写出来
    stringEnDeCodecn(str, 75L);   
      

  6.   


    ReRandom: 
    RANDOMINTEGER = Int(127 * Rnd) 
        
    If RANDOMINTEGER < 30 Or RANDOMINTEGER > 100 Then GoTo ReRandom 
    CHARNUM = CHARNUM Xor RANDOMINTEGER ——————————————————————————————————————第二行中生成的随机数每次生成的都是同样的数字?但是这段代码的第二行 RANDOMINTEGER 就是生成 0~127 之间的随机数啊,我看不
    出来为什么两次运行都会出来同样的结果。如果要让 Java 随机数产生与 VB 的所产生的随机数一样,那我就没办法了。
      

  7.   

    public class Test01 {
        
        public static void main(String[] args) {
            String str = "abc123";
            String s = stringEnDeCodecn(str, 75L);
            System.out.println(s);
        }
        
        public static String stringEnDeCodecn(String strSource, long ma) {
            if(strSource == null || strSource.length() == 0) {
                return "";
            }
            if(ma < 0) {
                ma = -ma;
            }
            Random ran = new Random(-ma);
            float x = ran.nextFloat();        
            StringBuilder sb = new StringBuilder();
            for(int i = 0; i < strSource.length(); i++) {            
                int randomInteger;
                do {
                    randomInteger = ran.nextInt(127); 
                }while(randomInteger < 30 || randomInteger > 100);            
                int charNum = vbAsc(strSource.charAt(i));
                charNum ^= randomInteger;
                sb.append(vbChr(charNum));
            }
            return sb.toString();
        }
        
        /**
         * 以 VB 的格式将一个字符转换成数字
          * @param c
         * @return
         */
        private static int vbAsc(char c) {
            if(c < 0xff) {
                return (int)c;
            }
            byte[] bys = null;
            try {
                bys = String.valueOf(c).getBytes("gbk");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            if(bys == null || bys.length < 2) {
                throw new IllegalArgumentException("ERROR! " + c + ", cannot be converted to VB ASCII.");
            }
            return 0xffff0000 | ((bys[0] & 0xff) << 8) | (bys[1] & 0xff);
        }
        
        /**
         * 以 VB 的格式将一个数值转换成字符
          * @param n
         * @return
         */
        private static char vbChr(int n) {
            n &= 0xffff;
            if(n < 0xff) {
                return (char)n;
            }
            byte[] bys = new byte[2];
            bys[0] = (byte)((n & 0xff00) >> 8);        
            bys[1] = (byte)(n & 0xff);
            String str = null;
            try {
                str = new String(bys, "gbk");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            if(str == null || str.length() < 1) {
                throw new IllegalArgumentException("ERROR! " + n + ", cannot be converted to a character.");
            }
            return str.charAt(0);
        }
    }这样可以保证每次生成的一样,但是还存在其他的问题,比如一些不可显字符什么的,
    而且也没办法做到跟 VB 的输出一样,因为随机数的产生方式 VB 和 Java 肯定是不
    一样的,还有前面我也说到了 Asc 和 Chr 两个 VB 函数我也不是很了解,我这样处
    理估计肯定有很多的问题。