Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1274
Благодарности: 1030

Профиль | Отправить PM | Цитировать


Цитата Shkutu:
А нет ли у кого-нибудь случаем алгоритма кодирования в/декодирования base64 для инно? »
Shkutu, держите, делал когда-то для одного товарища:
читать дальше »

Код: Выделить весь код
#define A = (Defined UNICODE) ? "W" : "A"

const
    CRYPT_STRING_BASE64 = $1;
    IS_TEXT_UNICODE_STATISTICS = $2;
 
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: String; cbMultiByte: Integer; lpWideCharStr: String; cchWideChar: Integer): Integer; external 'MultiByteToWideChar@kernel32.dll stdcall';
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: String; cchWideChar: Integer; lpMultiByteStr: String; cbMultiByte, lpDefaultChar: Integer; lpUsedDefaultChar: Longint): Integer; external 'WideCharToMultiByte@kernel32.dll stdcall';
function CryptBinaryToString(pbBinary: Longint; cbBinary, dwFlags: DWORD; pszString: Longint; var pcchString: DWORD): BOOL; external 'CryptBinaryToString{#A}@crypt32.dll stdcall';
function CryptStringToBinary(szString: String; cchString, dwFlags: DWORD; pbBinary: Longint; var pcbBinary, pdwSkip, pdwFlags: DWORD): BOOL; external 'CryptStringToBinary{#A}@crypt32.dll stdcall';
function IsTextUnicode(const lpv: String; iSize: Integer; var lpiResult: Integer): BOOL; external 'IsTextUnicode@advapi32.dll stdcall';

/////////////////////////////////////////////////////////////////////////////////////////////////////
function Base64Encode(const szString: String; const dwFlags: DWORD; const bUnicode: Boolean): String;
var
    cchString: DWORD;
    pszString, pszResult: Longint;
    iLength: Integer;
#ifdef UNICODE
    szAnsiString: AnsiString;
#endif
begin
    if Length(szString) = 0 then Exit;
    iLength := Length(szString);
    if bUnicode then
    begin
        iLength := iLength shl 1;
    #ifndef UNICODE
        SetLength(Result, iLength);
        MultiByteToWideChar(0, 1, szString, -1, Result, Length(Result));
        szString := Result;
    #endif
        pszString := CastStringToInteger(szString);
    end else begin
    #ifdef UNICODE
        szAnsiString := szString;
        pszString := CastAnsiStringToInteger(szAnsiString);
    #else
        pszString := CastStringToInteger(szString);
    #endif
    end;
    if not CryptBinaryToString(pszString, iLength, dwFlags, 0, cchString) then Exit;
    Result := StringOfChar(#0, cchString-1);
    pszResult := CastStringToInteger(Result);
    CryptBinaryToString(pszString, iLength, dwFlags, pszResult, cchString);
end;

////////////////////////////////////////////////////////////////////////////
function Base64Decode(const szString: String; const dwFlags: DWORD): String;
var
    cchString, dwSkip: DWORD;
    pszResult, iResult: Longint;
    szBuffer: String;
begin
    if Length(szString) = 0 then Exit;
    if not CryptStringToBinary(szString, Length(szString), dwFlags, 0, cchString, dwSkip, dwFlags) then Exit;
    Result := StringOfChar(#0, cchString);
    pszResult := CastStringToInteger(Result);
    CryptStringToBinary(szString, Length(szString), dwFlags, pszResult, cchString, dwSkip, dwFlags);
    szBuffer := Result;
    iResult := IS_TEXT_UNICODE_STATISTICS;
    if IsTextUnicode(Result, cchString, iResult) then
    begin
    #ifndef UNICODE
        SetLength(Result, Length(Result) shr 1);
        WideCharToMultiByte(0, 0, szBuffer, -1, Result, Length(Result), 0, 0);
    end;
    #else
        Result := CastIntegerToString(pszResult);
    end else Result := CastIntegerToAnsiString(pszResult);
    #endif
end;

/////////////////////////////
procedure InitializeWizard();
begin
    MsgBox(Format('Исходная строка: %s'#13#10'Кодированная строка (ANSI): %s', ['test1', Base64Encode('test1', CRYPT_STRING_BASE64, False)]), mbInformation, MB_OK);
    MsgBox(Format('Исходная строка: %s'#13#10'Кодированная строка (Unicode): %s', ['test1', Base64Encode('test1', CRYPT_STRING_BASE64, True)]), mbInformation, MB_OK);
    MsgBox(Format('Исходная строка (ANSI): %s'#13#10'Декодированная строка: %s', ['dGVzdDE=', Base64Decode('dGVzdDE=', CRYPT_STRING_BASE64)]), mbInformation, MB_OK);
    MsgBox(Format('Исходная строка (Unicode): %s'#13#10'Декодированная строка: %s', ['dABlAHMAdAAxAA==', Base64Decode('dABlAHMAdAAxAA==', CRYPT_STRING_BASE64)]), mbInformation, MB_OK);
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:57, 06-12-2013 | #1651