Ветеран

Сообщения: 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;
|