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
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
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
下面 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);
}
}
函数调用参数我给你写出来
stringEnDeCodecn(str, 75L);
ReRandom:
RANDOMINTEGER = Int(127 * Rnd)
If RANDOMINTEGER < 30 Or RANDOMINTEGER > 100 Then GoTo ReRandom
CHARNUM = CHARNUM Xor RANDOMINTEGER ——————————————————————————————————————第二行中生成的随机数每次生成的都是同样的数字?但是这段代码的第二行 RANDOMINTEGER 就是生成 0~127 之间的随机数啊,我看不
出来为什么两次运行都会出来同样的结果。如果要让 Java 随机数产生与 VB 的所产生的随机数一样,那我就没办法了。
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 函数我也不是很了解,我这样处
理估计肯定有很多的问题。