delphi bese64

const
  BASE_OFFSET = $3C;
  XOR_KEY = $AC;

function GetEncodeSize(InSize: Integer): Integer;
begin
  Result := (InSize * 4 + 2) div 3;
end;

function GetDecodeSize(InSize: Integer): Integer;
begin
  Result := Trunc(InSize * 3 / 4);
end;

function Encode6BitBuf2(Src, Dest: PChar; SrcLen, DestLen: Integer): Integer;
var
  I, RoundCount, Remainder: Integer;
  pbSrc, pbDest: PByte;
  Byte0, Byte1, Byte2: Byte;
begin
  Result := GetEncodeSize(SrcLen);    獲取加密後數據長度
  if Result > DestLen then
  begin
    SrcLen := GetDecodeSize(DestLen);
    Result := GetEncodeSize(SrcLen);
  end;

  pbSrc := PByte(Src);     
  pbDest := PByte(Dest);

  
  RoundCount := SrcLen div 3;  // 獲取輪述

  for I := 0 to RoundCount - 1 do
  begin
    Byte0 := pbSrc^ xor XOR_KEY;    Inc(pbSrc);  // 把此輪的三個字節進行異或加密
    Byte1 := pbSrc^ xor XOR_KEY;    Inc(pbSrc);  
    Byte2 := pbSrc^ xor XOR_KEY;    Inc(pbSrc);

    pbDest^ := ((Byte0 and $F0) shr 2) or (Byte0 and 3) + BASE_OFFSET;                // 取第一位的 0x11110011
    Inc(pbDest);

    pbDest^ := ((Byte1 and $F0) shr 2) or (Byte1 and 3) + BASE_OFFSET;              // 取第二字節的 0x11110011
    Inc(pbDest);

    pbDest^ := (Byte2 and $3F) + BASE_OFFSET;                                                     // 取三字節的0x00111111
    Inc(pbDest);

    pbDest^ := (((Byte2 and $C0) shr 2) or (Byte0 and $0C) or ((Byte1 and $0C) shr 2)) + BASE_OFFSET;

                                //去第一字節0x00001100 第二字節的0x00001100 第三字節0x11000000 
    Inc(pbDest);
  end;

  Remainder := SrcLen mod 3;                                                                        // 獲取剩餘字節的個數
  if Remainder = 1 then
  begin
    Byte0 := pbSrc^ xor XOR_KEY;    Inc(pbSrc);                                            // 剩餘一個字節

    pbDest^ := ((Byte0 and $F0) shr 2) or (Byte0 and 3) + BASE_OFFSET;    //取第一字節的0x11110011字節
    Inc(pbDest);

    pbDest^ := ((Byte0 and $0C) shr 2) + BASE_OFFSET;                               // 取第一字節的0x00001100
    Inc(pbDest);
  end
  else if Remainder = 2 then                                                                              // 剩餘兩個字節
  begin
    Byte0 := pbSrc^ xor XOR_KEY;    Inc(pbSrc);
    Byte1 := pbSrc^ xor XOR_KEY;    Inc(pbSrc);

    pbDest^ := ((Byte0 and $F0) shr 2) or (Byte0 and 3) + BASE_OFFSET;     // 第一字節的0x11110011字節 
    Inc(pbDest);

    pbDest^ := ((Byte1 and $F0) shr 2) or (Byte1 and 3) + BASE_OFFSET;      // 第二字節的0x11110011字節
    Inc(pbDest);

    pbDest^ := (Byte0 and $0C) or ((Byte1 and $0C) shr 2) + BASE_OFFSET;  // 取第一字節的0x00001100 第二字節0x00001100
    Inc(pbDest);
  end;
end;
 

 

function Decode6BitBuf2(Src, Dest: PChar; SrcLen, DestLen: Integer): Integer;
const
  BASE_OFFSET = $3C;
var
  I, RoundCount, Remainder: Integer;

  pbSrc, pbDest: PByte;
  Byte0, Byte1, Byte2, Byte3: Byte;
begin
  Result := GetDecodeSize(SrcLen);
  if Result > DestLen then
  begin
    SrcLen := GetEncodeSize(DestLen);
    Result := GetDecodeSize(SrcLen);
  end;

  pbSrc := PByte(Src);
  pbDest := PByte(Dest);

 
  RoundCount := SrcLen div 4;                                                                                          // RoundCount 執行輪數
  for I := 0 to RoundCount - 1 do
  begin
    Byte0 := (pbSrc^ - BASE_OFFSET);    Inc(pbSrc);                                                      // 對解密字符減去基礎字符
    Byte1 := (pbSrc^ - BASE_OFFSET);    Inc(pbSrc);
    Byte2 := (pbSrc^ - BASE_OFFSET);    Inc(pbSrc);
    Byte3 := (pbSrc^ - BASE_OFFSET);    Inc(pbSrc);

    pbDest^ := ((Byte0 shl 2 ) and $F3) or (Byte3 and $0C) or (Byte0 and $03); // 取第一字節0x11110011和第四字節0x00001100
    pbDest^ := pbDest^ xor XOR_KEY;                                                                 // 異或解密
    Inc(pbDest);

    pbDest^ := ((Byte1 shl 2) and $F3) or ((Byte3 and $03) shl 2) or (Byte1 and $03);
    pbDest^ := pbDest^ xor XOR_KEY;
    Inc(pbDest);

    pbDest^ := ((Byte3 and $30) shl 2) or Byte2;
    pbDest^ := pbDest^ xor XOR_KEY;
    Inc(pbDest);
  end;

  Remainder := SrcLen mod 4;
if Remainder = 2 then
  begin
    Byte0 := (pbSrc^ - BASE_OFFSET);    Inc(pbSrc);
    Byte1 := (pbSrc^ - BASE_OFFSET) ;    Inc(pbSrc);

    pbDest^ := ((Byte0 shl 2) and $F3) or ((Byte1 and $03) shl 2) or (Byte0 and $03);
    pbDest^ := pbDest^ xor XOR_KEY;
    Inc(pbDest);
  end
  else if Remainder = 3 then
  begin
    Byte0 :=(pbSrc^ - BASE_OFFSET);    Inc(pbSrc);
    Byte1 :=(pbSrc^ - BASE_OFFSET);    Inc(pbSrc);
    Byte2 :=(pbSrc^ - BASE_OFFSET);    Inc(pbSrc);

    pbDest^ := ((Byte0 shl 2) and $F3) or (Byte2 and $0C) or (Byte0 and $03);
    pbDest^ := pbDest^ xor XOR_KEY;
    Inc(pbDest);

    pbDest^ := ((Byte1 shl 2) and $F3) or ((Byte2 and 3) shl 2) or (Byte1 and $03);
    pbDest^ := pbDest^ xor XOR_KEY;
    Inc(pbDest);
  end;
end;
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章