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;
}

解决方案 »

  1.   

    对不起啊,以前上CSDN的时候不懂怎么玩,所以信誉值才这么低啊,我也不知道
      

  2.   

    Public Function encode(sn1 As String, sn2 As String) As String
    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
    还没翻译完
      

  3.   

    Public Function encode(sn1 As String, sn2 As String) As String
    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
      

  4.   

    Public Function decode(sn1 As String, sn2 As String) As String
    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
      

  5.   

    zhoujiamurong(zhoujiamurong) ( 谢谢兄弟  ,哈哈,好兄弟
      

  6.   

    这个程序的问题不少,我说的是C程序,我看了半天,这个程序也只能将一个长度不超过60的字符串加密。
    先看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函数,估计错不到哪里去。
      

  7.   

    对于C的程序,简单是一种美
    对于VB的程序,简单就是速度
      

  8.   

    常量引用传递,vb怎样用const我不清楚,所以翻译不了,看有人知道吗?
      

  9.   

    const就是用来定义一个常数,比如:Const Pi as single =3.1415927
    这里不是常量的引用传递。因为常量一旦定义,就不能改变内容了。所以这里传递的还是变量。
    大家应该可以发现,原文中那段C程序的参数使用的是字符串指针,而VB中没有指针,所以最接近的方法就是引用。 因为数组本身是无法直接作为参数传递到函数内部的,无论是C还是VB都不行,所以C就需要用指针来解决,而VB就要用引用来解决。两者的机制不同,但是结果一样的。