void encode(const char *sn1,char *sn2)
{
int pos[60]={31,39,50,18,14,23,59,51,37,5,55,40,21,49,12,29,3,32,25,56,41,36,34,52,4,57,8,20,58,9,11,35,53,28,1,13,26,16,30,47,38,42,6,45,17,48,10,19,33,22,44,0,54,24,27,7,46,2,15,43};
char buf[1024]="";
for(int i=0;i<strlen(sn1);i++){
sprintf(sn2,"%02x",(int)sn1[i]);
strcat(buf,sn2);
}
while(strlen(buf)<60){
strcat(buf,"00");
}
for(i=0;i<strlen(buf);i++){
sn2[i]=buf[pos[i]];
}
sn2[i]=0;
}
void decode(const char *sn1,char *sn2)
{
int pos[60]={31,39,50,18,14,23,59,51,37,5,55,40,21,49,12,29,3,32,25,56,41,36,34,52,4,57,8,20,58,9,11,35,53,28,1,13,26,16,30,47,38,42,6,45,17,48,10,19,33,22,44,0,54,24,27,7,46,2,15,43};
char buf[1024]="";
for(int i=0;i<strlen(sn1);i++){
buf[pos[i]]=sn1[i];
}
buf[i]=0;
int num=0;
for(i=0;i<strlen(buf);i+=2){
int a;
sscanf(buf+i,"%02x",&a);
if(a==0)continue;
sn2[num]=(char)a;
num++;
}
sn2[num]=0;
}
{
int pos[60]={31,39,50,18,14,23,59,51,37,5,55,40,21,49,12,29,3,32,25,56,41,36,34,52,4,57,8,20,58,9,11,35,53,28,1,13,26,16,30,47,38,42,6,45,17,48,10,19,33,22,44,0,54,24,27,7,46,2,15,43};
char buf[1024]="";
for(int i=0;i<strlen(sn1);i++){
sprintf(sn2,"%02x",(int)sn1[i]);
strcat(buf,sn2);
}
while(strlen(buf)<60){
strcat(buf,"00");
}
for(i=0;i<strlen(buf);i++){
sn2[i]=buf[pos[i]];
}
sn2[i]=0;
}
void decode(const char *sn1,char *sn2)
{
int pos[60]={31,39,50,18,14,23,59,51,37,5,55,40,21,49,12,29,3,32,25,56,41,36,34,52,4,57,8,20,58,9,11,35,53,28,1,13,26,16,30,47,38,42,6,45,17,48,10,19,33,22,44,0,54,24,27,7,46,2,15,43};
char buf[1024]="";
for(int i=0;i<strlen(sn1);i++){
buf[pos[i]]=sn1[i];
}
buf[i]=0;
int num=0;
for(i=0;i<strlen(buf);i+=2){
int a;
sscanf(buf+i,"%02x",&a);
if(a==0)continue;
sn2[num]=(char)a;
num++;
}
sn2[num]=0;
}
Dim pos As Variant
pos = Array(31, 39, 50, 18, 14, 23, 59, 51, 37, 5, 55, 40, 21, 49, 12, 29, 3, 32, 25, 56, 41, 36, 34, 52, 4, 57, 8, 20, 58, 9, 11, 35, 53, 28, 1, 13, 26, 16, 30, 47, 38, 42, 6, 45, 17, 48, 10, 19, 33, 22, 44, 0, 54, 24, 27, 7, 46, 2, 15, 43)
Dim buf As String
For i = 1 To Len(sn1) Step 1
sn2 = Hex(Asc(Right(Left(sn1, i), 1)))
buf = buf & sn2
Next iWhile Len(buf) < 60
buf = buf & "00"
Wendencode = sn2
End Function
还没翻译完
Dim pos As Variant
pos = Array(31, 39, 50, 18, 14, 23, 59, 51, 37, 5, 55, 40, 21, 49, 12, 29, 3, 32, 25, 56, 41, 36, 34, 52, 4, 57, 8, 20, 58, 9, 11, 35, 53, 28, 1, 13, 26, 16, 30, 47, 38, 42, 6, 45, 17, 48, 10, 19, 33, 22, 44, 0, 54, 24, 27, 7, 46, 2, 15, 43)
Dim buf As String
For i = 1 To Len(sn1) Step 1
sn2 = Hex(Asc(Right(Left(sn1, i), 1)))
buf = buf & sn2
Next iWhile Len(buf) < 60
buf = buf & "00"
Wendsn2 = ""
For i = 0 To Len(buf) - 1 Step 1
sn2 = sn2 & Right(Left(buf, pos(i) + 1), 1)
Next i
'MsgBox pos(0)
encode = sn2
End Function
Dim pos As Variant
pos = Array(31, 39, 50, 18, 14, 23, 59, 51, 37, 5, 55, 40, 21, 49, 12, 29, 3, 32, 25, 56, 41, 36, 34, 52, 4, 57, 8, 20, 58, 9, 11, 35, 53, 28, 1, 13, 26, 16, 30, 47, 38, 42, 6, 45, 17, 48, 10, 19, 33, 22, 44, 0, 54, 24, 27, 7, 46, 2, 15, 43)
Dim buf(1023) As String
For i = 0 To Len(sn1) - 1 Step 1
buf(pos(i)) = Right(Left(sn1, i + 1), 1)
Next i
Dim j As Integer
Dim a As Integer
Dim temp As String
j = i
For i = 0 To j - 1 Step 2
temp = "&H" & buf(i) & buf(i + 1)
a = CInt(temp)
If (a = 0) Then GoTo continue
sn2 = sn2 & Chr(a)
continue:
Next i
decode = sn2End Function
先看ENCODE中的代码
如果需要加密的字符串长度大于60,则下面的语句必定溢出,因为POS本身只有从0到59
for(i=0;i<strlen(buf);i++) sn2[i]=buf[pos[i]];
同样的情况可发生在DECODE中:
for(int i=0;i<strlen(sn1);i++) buf[pos[i]]=sn1[i];
上面的那两句语句,我把多余的两个"{}"拿掉了,看着嫌罗嗦。算我鸡蛋里挑骨头吧,顺便帮上面几位翻译的代码再优化一下
首先是函数申明:
Public Function encode(sn1 As String, sn2 As String) As String
和
Public Function decode(sn1 As String, sn2 As String) As String
改为:Public Sub encode(sn1 As String, sn2 As String)
Public Sub decode(sn1 As String, sn2 As String)
'已经是按引用传递了,就不必再返回什么东西了,否则那个sn2用来作什么呢??同样,后面那句encode = sn2和decode = sn2 也就可以免了。并且这样才符合原来的那个C的程序,人家明明是VOID类型的函数,咱也不好改成字符型的吧。在ENCODE函数中的:
For i = 1 To Len(sn1) Step 1
sn2 = Hex(Asc(Right(Left(sn1, i), 1)))
buf = buf & sn2
Next i
建议改为
For i = 1 To Len(sn1)
buf = buf & Hex(Asc(mid(sn1, i,1)))
Next While Len(buf) < 60
buf = buf & "00"
Wend
改为:
i=len(buf)
if i<60 then buf = buf & space(60-i)在DECODE函数中的
If (a = 0) Then GoTo continue
sn2 = sn2 & Chr(a)
Next i
改为
If (a <> 0) sn2 = sn2 & Chr(a)
next
没有仔细看那个DECODE函数,估计错不到哪里去。
对于VB的程序,简单就是速度
这里不是常量的引用传递。因为常量一旦定义,就不能改变内容了。所以这里传递的还是变量。
大家应该可以发现,原文中那段C程序的参数使用的是字符串指针,而VB中没有指针,所以最接近的方法就是引用。 因为数组本身是无法直接作为参数传递到函数内部的,无论是C还是VB都不行,所以C就需要用指针来解决,而VB就要用引用来解决。两者的机制不同,但是结果一样的。