{编码函数:输入——text,输出——entext}
void EncodeText(char *text,char *entext)
{
char tmpmessage[160];
char ASC64[64];
int i,k,Length,j; for(i=0;i<12;i++)
ASC64[i]=48+i;
for(i=12;i<38;i++)
ASC64[i]=53+i;
for(i=38;i<64;i++)
ASC64[i]=59+i; memcpy(tmpmessage,text,158);
tmpmessage[159]=0;
Length=strlen(tmpmessage);

k=0;
j=0;
for(i=0,k=0,j=0;i<Length/3;i++){
entext[k++]=(tmpmessage[j]>>2)&0x3F;
entext[k++]=((tmpmessage[j]<<4)|((tmpmessage[j+1]>>4)&0x0F))&0x3F;
entext[k++]=(tmpmessage[j+1]<<2|((tmpmessage[j+2]>>6)&0x03))&0x3F;
entext[k++]=tmpmessage[j+2]&0x3F;
j=j+3;
}
if(Length%3==0)
entext[k]=0;
if(Length%3==1){
entext[k++]=(tmpmessage[j]>>2)&0x3F;
entext[k++]=(tmpmessage[j]<<4)&0x3F;
entext[k]=0;
}
if(Length%3==2){
entext[k++]=(tmpmessage[j]>>2)&0x3F;
entext[k++]=(tmpmessage[j]<<4|((tmpmessage[j+1]>>4)&0x0F))&0x3F;
entext[k++]=(tmpmessage[j+1]<<2)&0x3F;
entext[k]=0;
}
Length=strlen(entext);
for(i=0;i<Length;i++)
entext[i]=ASC64[entext[i]];
entext[Length]=0;
}

解决方案 »

  1.   

    //[email protected]
    //910.78910.com
    unit Unit2;interface
     procedure EncodeText(text: string; out entext: string);
    implementation{
    语法已经我给你翻译称Pascal语言了,因为语言不同可能存在以下问题你自己解决,
    已在Delphi 5编译通过!
    1、Pascal 里string 格式的字符串索引是从1开始,不是0开始!
    2、在字符串末尾没必要加NULL,也就是0。也许我写的#0 也没必要加
    3、请确认++是否改正确。
    4、确认语句 entext[i]:= ASC64[ord(entext[i])];是否正确。
    5、Pascal 的for 循环始终是包含边界的,不象C自由,也没有 i+= 3。
    6、给分吧大哥,我花了半个多小时休息时间给改的,Kiss一下,呵呵
    }
    procedure EncodeText(text: string; out entext: string);
    var
    tmpmessage: string[160];
    ASC64: string[64];
    i,k,Length1,j: integer;
    Begin
    for i:= 0 to 12 - 1 do
      ASC64[i]:= chr(48 + i);
    for i:=12 to 38 - 1 do
              ASC64[i]:= chr(53 + i);
    for i:=38 to 64 - 1 do
      ASC64[i]:= chr(59 + i);        tmpmessage:= Copy(text, 1, 158); //memcpy(tmpmessage,text,158); //tmpmessage[159]:=0;
    Length1:= length(tmpmessage); k:=0;
    j:=0;
    for i:=0 to Length1 div 3 - 1 do
                    Begin
                    k:= ord(tmpmessage[j]) shr 2;
    entext[k]:= chr((ord(tmpmessage[j]) shr 2) and $3F);
                            inc(k);
    entext[k]:= chr(((ord(tmpmessage[j]) shl 4) or ((ord(tmpmessage[j+1]) shr 4) and $0F)) and $3F);
                            inc(k);
    entext[k]:= chr((ord(tmpmessage[j+1]) shl 2 or ((ord(tmpmessage[j+2]) shr 6) and $03)) and $3F);
                            inc(k);
    entext[k]:= chr(ord(tmpmessage[j+2]) and $3F);
                            inc(k);
    inc(j, 3);//j=j+3;
    End;
    if Length1 mod 3 =0 then
    entext[k]:= #0;
    if Length1 mod 3 = 1 then
                    Begin
    entext[k]:= chr((ord(tmpmessage[j]) shr 2) and $3F);
                            inc(k);
    entext[k]:= chr((ord(tmpmessage[j]) shl 4) and $3F);
                            inc(k);
    entext[k]:= #0;
    End;
    if Length1 mod 3 = 2 then
                    Begin
    entext[k]:= chr((ord(tmpmessage[j]) shr 2) and $3F);
                            inc(k);
    entext[k]:= chr((ord(tmpmessage[j]) shl 4 or ((ord(tmpmessage[j+1]) shr 4) and $0F)) and $3F);
                            inc(k);
    entext[k]:= chr((ord(tmpmessage[j+1]) shl 2) and $3F);
                            inc(k);
    entext[k]:= #0;
    End;
    Length1:= length(entext);
    for i:=0 to Length1 - 1 do
    entext[i]:= ASC64[ord(entext[i])]; //不知道是否这意思?entext[i]:= ASC64[entext[i]];
    entext[Length1]:=#0;
    End;
    end.
      

  2.   

    //修改一下man8888的代码~~
    //“k:= ord(tmpmessage[j]) shr 2;”这句话没有用~~
    //man8888来亲一口!~~procedure EncodeText(mSource: PChar; mDest: PChar);
    const
      cASC64: array[0..63] of Char =
    '0123456789:;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    var
      vBuffer: array[0..160] of Char;
      I, K, L, J: Integer;
    begin
      StrLCopy(vBuffer, mSource, 158);
      vBuffer[159] := #0;
      L := StrLen(vBuffer);
      K := 0;
      J := 0;
      for I := 0 to L div 3 - 1 do begin
        mDest[K]:= Chr((Ord(vBuffer[J]) shr 2) and $3F);
        Inc(K);
        mDest[K]:= Chr(((Ord(vBuffer[J]) shl 4) or ((Ord(vBuffer[J + 1]) shr 4) and $0F)) and $3F);
        Inc(K);
        mDest[K]:= Chr((Ord(vBuffer[J + 1]) shl 2 or ((Ord(vBuffer[J + 2]) shr 6) and $03)) and $3F);
        Inc(K);
        mDest[K]:= Chr(Ord(vBuffer[J + 2]) and $3F);
        Inc(K);
        Inc(J, 3);
      end;  if L mod 3 = 0 then mDest[K] := #0;  if L mod 3 = 1 then begin
        mDest[K] := Chr((Ord(vBuffer[J]) shr 2) and $3F);
        Inc(K);
        mDest[K]:= Chr((Ord(vBuffer[J]) shl 4) and $3F);
        Inc(K);
        mDest[K]:= #0;
      end;  if L mod 3 = 2 then begin
        mDest[K]:= Chr((Ord(vBuffer[J]) shr 2) and $3F);
        Inc(K);
        mDest[K]:= Chr((Ord(vBuffer[J]) shl 4 or ((Ord(vBuffer[J + 1]) shr 4) and $0F)) and $3F);
        Inc(K);
        mDest[K]:= Chr((Ord(vBuffer[J + 1]) shl 2) and $3F);
        Inc(K);
        mDest[K]:= #0;
      end;  L := StrLen(mDest);
      for I := 0 to L - 1 do mDest[I] := cASC64[Ord(mDest[I])];
      mDest[L] := #0;
    end; { EncodeText }//Demo
    procedure TForm1.Button1Click(Sender: TObject);
    var
      vBuffer: array[0..256] of Char;
    begin
      EncodeText(PChar(Edit1.Text), vBuffer);
      Edit2.Text := vBuffer;
    end;