powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / BASE64-HMAC-SHA384
25 сообщений из 66, страница 2 из 3
BASE64-HMAC-SHA384
    #39500433
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Няшик]Забыл приложить как тестил на скорость
А где исходники ZStartTime и ZStopTime?
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500437
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

Извиняюсь что не приложил. Вот полный исходный код, проект консольного приложения, + включить в настройках проекта галочку оптимизации



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
program Project2;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  windows, System.SysUtils;

function memcmp(ptr1: PAnsiChar; ptr2: PAnsiChar; num: DWORD): Integer; cdecl;
  external 'Ntdll.dll' name 'memcmp';

function sprintf(S: PAnsiChar; const Format: PAnsiChar): Integer; cdecl; varargs;
  external 'msvcrt.dll';

function ZStartTime(var StartTime: Int64): Boolean;
begin
  Result := QueryPerformanceCounter(StartTime);
end;

function ZStopTime(const StartTime: Int64): AnsiString;
var
  iCounterPerSec, StopTime: Int64;
  time: Single;
begin
  if QueryPerformanceCounter(StopTime) then
  begin
    if QueryPerformanceFrequency(iCounterPerSec) then
    begin

      time := (0 - StartTime + StopTime) / iCounterPerSec;

      Result := '';
      SetLength(Result, 25);

      SetLength(Result, sprintf(PAnsiChar(Result), 'Result: %f sec.', time));
    end
    else
      Result := 'Error[ZStopTime(QueryPerformanceFrequency)]';
  end
  else
    Result := 'Error[ZStopTime(QueryPerformanceCounter)]';
end;

function base64_encode(const str: string): string;
const
  table: PWideChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
type
  PArrayChars = ^TArrayChars;
  TArrayChars = array of char;
var
  len, i, r: Integer;
  a, b: Byte;
  Sum: Cardinal;
begin
  len := Length(str);

  SetLength(Result, ((len + 2) div 3) * 4);

  i := 0;
  r := 0;
  while i <= len - 3 do
  begin
    Sum := WORD(str[i + 1]) shl 16 + WORD(str[i + 2]) shl 8 + WORD(str[i + 3]);

    PArrayChars(@Result)^[r + 0] := table[Sum shr 18 and $3F];
    PArrayChars(@Result)^[r + 1] := table[Sum shr 12 and $3F];
    PArrayChars(@Result)^[r + 2] := table[Sum shr 6 and $3F];
    PArrayChars(@Result)^[r + 3] := table[Sum and $3F];

    inc(i, 3);
    inc(r, 4);
  end;

  case len mod 3 of
    1:
      begin
        a := WORD(str[len]) and $FF;
        PArrayChars(@Result)^[r + 0] := table[a SHR 2];
        PArrayChars(@Result)^[r + 1] := table[a and 3 SHL 4];
        PArrayChars(@Result)^[r + 2] := '=';
        PArrayChars(@Result)^[r + 3] := '=';
      end;
    2:
      begin
        a := WORD(str[i + 1]) and $FF;
        b := WORD(str[i + 2]) and $FF;
        PArrayChars(@Result)^[r + 0] := table[a SHR 2];
        PArrayChars(@Result)^[r + 1] := table[((a and 3) SHL 4) or (b SHR 4)];
        PArrayChars(@Result)^[r + 2] := table[b and $0F SHL 2];
        PArrayChars(@Result)^[r + 3] := '=';
      end;
  end;
end;

var
  i: Cardinal;
  StartTime: Int64;

begin
  try
    Writeln(base64_encode('HytujkyHytujkyukHytujkyukuk'));
    if ZStartTime(StartTime) then
    begin
      for i := 0 to 10000000 do
      begin
        base64_encode('HytujkyHytujkyukHytujkyukuk');
      end;
      Writeln(ZStopTime(StartTime));
    end;

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.




Выдаёт даже 0.926001 это 280000000 символов на моём то железе. Результаты более чем хорошие
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500486
Barney83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock,

Не работает пример, валится на
UpdateLastError( 'CryptCreateHash (2)' );


Для алгоритма SHA_384 использовал
const
CALG_SHA_384 = $0000800d;
type
THMAC_SHA384_DATA = packed array[ 0 .. 47 ] of Byte;

procedure TForm6.FormCreate(Sender: TObject);
var
MyData : THMAC_SHA384_DATA;
begin
..
if HMAC_SHA384('MyString','MyKey',MyData) then
..
end;


Может у кого есть dll с другого языка?
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500493
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Я так понимаю, у тебя не Unicode delphi, да? Иначе если ему на вход передать строку с русскими символами, то он неправильно её обрабатывает.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500510
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpНяшик,

Я так понимаю, у тебя не Unicode delphi, да? Иначе если ему на вход передать строку с русскими символами, то он неправильно её обрабатывает.

Тоже интеесно чего это он. Ввёл 1 русский символ П, и запустил. На строке

Код: pascal
1.
        a := WORD(str[len]);



Вывел 31 хотя код соответствует 207 ... Следовательно это косяк редактора среды.

У меня Токио.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500511
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Дело не в этом, а в
Код: pascal
1.
Sum := WORD(str[i + 1]) shl 16 + WORD(str[i + 2]) shl 8 + WORD(str[i + 3]);

в этой строке тупо переполнение будет, т.к. 3 символа - это 6 (шесть) байт, а не 3. И никак ты их в три байта не загонишь без потерь, хоть тресни.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500512
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Попробуй какой-нибудь файл своей функцией закодировать и ты поймешь о чём я.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500523
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикТоже интеесно чего это он. Ввёл 1 русский символ П, и запустил. На строке

Код: pascal
1.
        a := WORD(str[len]);


Вывел 31 хотя код соответствует 207 ... Следовательно это косяк редактора среды.
У меня Токио.
А 'a' - это какой тип?... Потому что русская "П" - это 0x041F, а 31 - это 0x1F. Улавливаешь? :)
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500549
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpНяшик,

Я так понимаю, у тебя не Unicode delphi, да? Иначе если ему на вход передать строку с русскими символами, то он неправильно её обрабатывает.Ну чё пристал? Зато быстро! Быстро, Карл! (развелось оптимизаторов )))
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500555
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerНу чё пристал? Зато быстро! Быстро, Карл! (развелось оптимизаторов )))
Хотите быстро и оптимизаций?... их есть у нас
x86 only

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
var
  B64Code: array [0..63] of AnsiChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  B64Tail: AnsiChar = '=';
  
function Base64EncodedSize(InSize: Integer): Integer;
asm
  // вход:  eax - размер исходных данных
  // выход: eax - размер буфера, ecx - кол-во триплетов, edx - размер "хвоста"
  test  eax, eax
  jns   @@positive
  xor   eax, eax
@@positive:
  xor   edx, edx
  xor   ecx, ecx
  mov   cl, $03
  div   ecx
  mov   ecx, eax
  test  edx, edx
  jz    @@zerotail
  inc   eax
@@zerotail:
  shl   eax, 2
end;

function Base64Encode(Size: Integer; Source: Pointer; out Code: AnsiString): Boolean; register;
const
  MaxSize = MaxInt div 4 * 3;
asm
  cmp   eax, MaxSize
  jbe   @@proceed
  xor   eax, eax
  ret
@@proceed:
  push  ebp
  push  ebx
  push  edi
  push  esi
  push  ecx                            { « @Code }
  mov   esi, edx
  call  Base64EncodedSize
  mov   ebp, ecx
  xchg  eax, edx                       { edx = length, eax = tailsize }
  xchg  dword ptr [esp], eax           { @Code «» tailsize }
  xor   ecx, ecx                       { CodePage = 0 (System Default) }
  call  System.@LStrSetLength
  mov   edi, dword ptr [eax]
  lea   edx, B64Code
  test  ebp, ebp
  jz    @@tailpart
@@mainloop:
  movzx eax, byte ptr [esi]            { ax » 00000000 aaaaaaaa }
  mov   bh,  byte ptr [esi + 1]
  mov   bl,  byte ptr [esi + 2]        { bx » bbbbbbbb cccccccc }
  shl   eax, 8
  mov   al,  bh                        { ax » aaaaaaaa bbbbbbbb }
  mov   ecx, ebx                       { cx » bbbbbbbb cccccccc }
  lea   esi, [esi + 3]
  shr   ecx, 6                         { cx » 000000bb bbbbbbcc }
  and   ebx, $3F                       { bx » 00000000 00cccccc }
  and   ecx, $3F                       { cx » 000000bb 00bbbbcc }
  mov   cl,  [edx + ecx]
  mov   ch,  [edx + ebx]               { cx » 00cccccc 00bbbbcc }
@@halfblock:
  shr   eax, 4                         { ax » 0000aaaa aaaabbbb }
  mov   ebx, eax                       { bx » 0000aaaa aaaabbbb }
  and   eax, $3F                       { ax » 00000000 00aabbbb }
  shr   ebx, 6                         { bx » 00000000 00aaaaaa }
  shl   ecx, 16
  mov   ch,  [edx + eax]
  mov   cl,  [edx + ebx]               { cx » 00aabbbb 00aaaaaa }
  mov   [edi], ecx
  lea   edi, [edi + 4]
  dec   ebp
  jnz   @@mainloop
@@tailpart:
  pop   ecx                            { » размер хвоста }
  test  ecx, ecx
  jz    @@finalize
  push  $00                            { « размер хвоста = 0 }
  movzx eax, byte ptr [esi]            { ax » 00000000 aaaaaaaa }
  movzx ebx, byte ptr [B64Tail]        { bx » 00000000 ======== }
  shl   eax, 8                         { ax » aaaaaaaa 00000000 }
  dec   ecx
  jz    @@encode
  mov   bl, [esi + 1]                  { bx » 00000000 bbbbbbbb }
  mov   al, bl                         { ax » aaaaaaaa bbbbbbbb }
  shl   bl, 2                          { bx » 00000000 bbbbbb00 }
  and   bl, $3F                        { bx » 00000000 00bbbb00 }
  mov   bl, [edx + ebx]
@@encode:
  mov   ch, byte ptr [B64Tail]
  mov   cl, bl                         { cx » ======== 00bbbb00 или ======== ======== }
  inc   ebp
  jmp   @@halfblock
@@finalize:
  lea   eax, [ecx + 1]
  pop   esi
  pop   edi
  pop   ebx
  pop   ebp
end;


...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500581
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpwhite_niggerНу чё пристал? Зато быстро! Быстро, Карл! (развелось оптимизаторов )))
Хотите быстро и оптимизаций?... их есть у нас
x86 only

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
var
  B64Code: array [0..63] of AnsiChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  B64Tail: AnsiChar = '=';
  
function Base64EncodedSize(InSize: Integer): Integer;
asm
  // вход:  eax - размер исходных данных
  // выход: eax - размер буфера, ecx - кол-во триплетов, edx - размер "хвоста"
  test  eax, eax
  jns   @@positive
  xor   eax, eax
@@positive:
  xor   edx, edx
  xor   ecx, ecx
  mov   cl, $03
  div   ecx
  mov   ecx, eax
  test  edx, edx
  jz    @@zerotail
  inc   eax
@@zerotail:
  shl   eax, 2
end;

function Base64Encode(Size: Integer; Source: Pointer; out Code: AnsiString): Boolean; register;
const
  MaxSize = MaxInt div 4 * 3;
asm
  cmp   eax, MaxSize
  jbe   @@proceed
  xor   eax, eax
  ret
@@proceed:
  push  ebp
  push  ebx
  push  edi
  push  esi
  push  ecx                            { « @Code }
  mov   esi, edx
  call  Base64EncodedSize
  mov   ebp, ecx
  xchg  eax, edx                       { edx = length, eax = tailsize }
  xchg  dword ptr [esp], eax           { @Code «» tailsize }
  xor   ecx, ecx                       { CodePage = 0 (System Default) }
  call  System.@LStrSetLength
  mov   edi, dword ptr [eax]
  lea   edx, B64Code
  test  ebp, ebp
  jz    @@tailpart
@@mainloop:
  movzx eax, byte ptr [esi]            { ax » 00000000 aaaaaaaa }
  mov   bh,  byte ptr [esi + 1]
  mov   bl,  byte ptr [esi + 2]        { bx » bbbbbbbb cccccccc }
  shl   eax, 8
  mov   al,  bh                        { ax » aaaaaaaa bbbbbbbb }
  mov   ecx, ebx                       { cx » bbbbbbbb cccccccc }
  lea   esi, [esi + 3]
  shr   ecx, 6                         { cx » 000000bb bbbbbbcc }
  and   ebx, $3F                       { bx » 00000000 00cccccc }
  and   ecx, $3F                       { cx » 000000bb 00bbbbcc }
  mov   cl,  [edx + ecx]
  mov   ch,  [edx + ebx]               { cx » 00cccccc 00bbbbcc }
@@halfblock:
  shr   eax, 4                         { ax » 0000aaaa aaaabbbb }
  mov   ebx, eax                       { bx » 0000aaaa aaaabbbb }
  and   eax, $3F                       { ax » 00000000 00aabbbb }
  shr   ebx, 6                         { bx » 00000000 00aaaaaa }
  shl   ecx, 16
  mov   ch,  [edx + eax]
  mov   cl,  [edx + ebx]               { cx » 00aabbbb 00aaaaaa }
  mov   [edi], ecx
  lea   edi, [edi + 4]
  dec   ebp
  jnz   @@mainloop
@@tailpart:
  pop   ecx                            { » размер хвоста }
  test  ecx, ecx
  jz    @@finalize
  push  $00                            { « размер хвоста = 0 }
  movzx eax, byte ptr [esi]            { ax » 00000000 aaaaaaaa }
  movzx ebx, byte ptr [B64Tail]        { bx » 00000000 ======== }
  shl   eax, 8                         { ax » aaaaaaaa 00000000 }
  dec   ecx
  jz    @@encode
  mov   bl, [esi + 1]                  { bx » 00000000 bbbbbbbb }
  mov   al, bl                         { ax » aaaaaaaa bbbbbbbb }
  shl   bl, 2                          { bx » 00000000 bbbbbb00 }
  and   bl, $3F                        { bx » 00000000 00bbbb00 }
  mov   bl, [edx + ebx]
@@encode:
  mov   ch, byte ptr [B64Tail]
  mov   cl, bl                         { cx » ======== 00bbbb00 или ======== ======== }
  inc   ebp
  jmp   @@halfblock
@@finalize:
  lea   eax, [ecx + 1]
  pop   esi
  pop   edi
  pop   ebx
  pop   ebp
end;





Уви, дорогой сэр. Это работает медленнее моего кода, плюс тоже не юникод. Сейчас обмозгую как его добавить в свой код, и скину пример
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500583
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем вышло вот такое, правда уже не секунда. А целых 3.052310 секунды. Но за то поддержка юникода

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
program Project2;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  windows, System.SysUtils;

function sprintf(S: PAnsiChar; const Format: PAnsiChar): Integer; cdecl; varargs;
  external 'msvcrt.dll';

function ZStartTime(var StartTime: Int64): Boolean;
begin
  Result := QueryPerformanceCounter(StartTime);
end;

function ZStopTime(const StartTime: Int64): AnsiString;
var
  iCounterPerSec, StopTime: Int64;
  time: Single;
begin
  if QueryPerformanceCounter(StopTime) then
  begin
    if QueryPerformanceFrequency(iCounterPerSec) then
    begin

      time := (0 - StartTime + StopTime) / iCounterPerSec;

      Result := '';
      SetLength(Result, 25);

      SetLength(Result, sprintf(PAnsiChar(Result), 'Result: %f sec.', time));
    end
    else
      Result := 'Error[ZStopTime(QueryPerformanceFrequency)]';
  end
  else
    Result := 'Error[ZStopTime(QueryPerformanceCounter)]';
end;

function base64_encode(const str: string): string;
const
  table: PWideChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
type
  PArrayChars = ^TArrayChars;
  TArrayChars = array of Char;
  TArrayBytes = array of Byte;
var
  len, i, r, j: Integer;
  f: TArrayBytes;
  c: PWideChar;
  bb: Char;
begin
  j := 0;
  r := 0;
  len := Length(str);

  SetLength(f, len * 3);

  c := Pointer(str);
  bb := c[0];
  while bb <> #0 do
  begin
    if WORD(bb) < 128 then
    begin
      f[j] := WORD(bb);
      inc(j);
    end
    else if WORD(bb) < 2048 then
    begin
      f[j] := ((WORD(bb) shr 6) or 192);
      f[j + 1] := ((WORD(bb) and 63) or 128);
      inc(j, 2);
    end
    else
    begin
      f[j] := (224 + (WORD(bb) shr 12));
      f[j + 1] := (128 + ((WORD(bb) shr 6) and 63));
      f[j + 2] := (128 + (WORD(bb) and 63));
      inc(j, 3);
    end;
    inc(r);
    bb := c[r];
  end;

  SetLength(Result, ((j + 2) div 3) * 4);

  i := 0;
  r := 0;
  while j >= 3 do
  begin
    PArrayChars(@Result)^[r + 0] := table[f[i] SHR 2];
    PArrayChars(@Result)^[r + 1] := table[((f[i] and 3) SHL 4) or (f[i + 1] SHR 4)];
    PArrayChars(@Result)^[r + 2] := table[((f[i + 1] and 15) SHL 2) or (f[i + 2] SHR 6)];
    PArrayChars(@Result)^[r + 3] := table[f[i + 2] and 63];
    inc(i, 3);
    inc(r, 4);
    dec(j, 3);
  end;

  case j of
    1:
      begin
        PArrayChars(@Result)^[r + 0] := table[f[i] SHR 2];
        PArrayChars(@Result)^[r + 1] := table[f[i] and 3 SHL 4];
        PArrayChars(@Result)^[r + 2] := '=';
        PArrayChars(@Result)^[r + 3] := '=';
      end;
    2:
      begin
        PArrayChars(@Result)^[r + 0] := table[f[i] SHR 2];
        PArrayChars(@Result)^[r + 1] := table[((f[i] and 3) SHL 4) or (f[i + 1] SHR 4)];
        PArrayChars(@Result)^[r + 2] := table[f[i + 1] and $0F SHL 2];
        PArrayChars(@Result)^[r + 3] := '=';
      end;
  end;
end;

var
  i: Cardinal;
  StartTime: Int64;

begin
 // 0K7QvdC40LrQvtC0ISDOtc+Bzr/inaTinaTOtc+Bzr/inaQ=
  Writeln(base64_encode('Юникод! &#949;&#961;&#959;&#10084;&#10084;&#949;&#961;&#959;&#10084;'));

  try
    if ZStartTime(StartTime) then
    begin
      for i := 0 to 10000000 do
      begin
        base64_encode('HytujkyHytujkyukHytujkyukuk');
      end;
      Writeln(ZStopTime(StartTime));
    end;

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.

...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500613
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикВ общем вышло вот такое, правда уже не секунда. А целых 3.052310 секунды. Но за то поддержка юникода

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
program Project2;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  windows, System.SysUtils;

function sprintf(S: PAnsiChar; const Format: PAnsiChar): Integer; cdecl; varargs;
  external 'msvcrt.dll';

function ZStartTime(var StartTime: Int64): Boolean;
begin
  Result := QueryPerformanceCounter(StartTime);
end;

function ZStopTime(const StartTime: Int64): AnsiString;
var
  iCounterPerSec, StopTime: Int64;
  time: Single;
begin
  if QueryPerformanceCounter(StopTime) then
  begin
    if QueryPerformanceFrequency(iCounterPerSec) then
    begin

      time := (0 - StartTime + StopTime) / iCounterPerSec;

      Result := '';
      SetLength(Result, 25);

      SetLength(Result, sprintf(PAnsiChar(Result), 'Result: %f sec.', time));
    end
    else
      Result := 'Error[ZStopTime(QueryPerformanceFrequency)]';
  end
  else
    Result := 'Error[ZStopTime(QueryPerformanceCounter)]';
end;

function base64_encode(const str: string): string;
const
  table: PWideChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
type
  PArrayChars = ^TArrayChars;
  TArrayChars = array of Char;
  TArrayBytes = array of Byte;
var
  len, i, r, j: Integer;
  f: TArrayBytes;
  c: PWideChar;
  bb: Char;
begin
  j := 0;
  r := 0;
  len := Length(str);

  SetLength(f, len * 3);

  c := Pointer(str);
  bb := c[0];
  while bb <> #0 do
  begin
    if WORD(bb) < 128 then
    begin
      f[j] := WORD(bb);
      inc(j);
    end
    else if WORD(bb) < 2048 then
    begin
      f[j] := ((WORD(bb) shr 6) or 192);
      f[j + 1] := ((WORD(bb) and 63) or 128);
      inc(j, 2);
    end
    else
    begin
      f[j] := (224 + (WORD(bb) shr 12));
      f[j + 1] := (128 + ((WORD(bb) shr 6) and 63));
      f[j + 2] := (128 + (WORD(bb) and 63));
      inc(j, 3);
    end;
    inc(r);
    bb := c[r];
  end;

  SetLength(Result, ((j + 2) div 3) * 4);

  i := 0;
  r := 0;
  while j >= 3 do
  begin
    PArrayChars(@Result)^[r + 0] := table[f[i] SHR 2];
    PArrayChars(@Result)^[r + 1] := table[((f[i] and 3) SHL 4) or (f[i + 1] SHR 4)];
    PArrayChars(@Result)^[r + 2] := table[((f[i + 1] and 15) SHL 2) or (f[i + 2] SHR 6)];
    PArrayChars(@Result)^[r + 3] := table[f[i + 2] and 63];
    inc(i, 3);
    inc(r, 4);
    dec(j, 3);
  end;

  case j of
    1:
      begin
        PArrayChars(@Result)^[r + 0] := table[f[i] SHR 2];
        PArrayChars(@Result)^[r + 1] := table[f[i] and 3 SHL 4];
        PArrayChars(@Result)^[r + 2] := '=';
        PArrayChars(@Result)^[r + 3] := '=';
      end;
    2:
      begin
        PArrayChars(@Result)^[r + 0] := table[f[i] SHR 2];
        PArrayChars(@Result)^[r + 1] := table[((f[i] and 3) SHL 4) or (f[i + 1] SHR 4)];
        PArrayChars(@Result)^[r + 2] := table[f[i + 1] and $0F SHL 2];
        PArrayChars(@Result)^[r + 3] := '=';
      end;
  end;
end;

var
  i: Cardinal;
  StartTime: Int64;

begin
 // 0K7QvdC40LrQvtC0ISDOtc+Bzr/inaTinaTOtc+Bzr/inaQ=
  Writeln(base64_encode('Юникод! &#949;&#961;&#959;&#10084;&#10084;&#949;&#961;&#959;&#10084;'));

  try
    if ZStartTime(StartTime) then
    begin
      for i := 0 to 10000000 do
      begin
        base64_encode('HytujkyHytujkyukHytujkyukuk');
      end;
      Writeln(ZStopTime(StartTime));
    end;

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.



Скажи пожалуйста, а кому уперлись в пень твои секунды ? Или ты за чистое искусство страдаешь ?
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500619
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiНяшикВ общем вышло вот такое, правда уже не секунда. А целых 3.052310 секунды. Но за то поддержка юникода

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
program Project2;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  windows, System.SysUtils;

function sprintf(S: PAnsiChar; const Format: PAnsiChar): Integer; cdecl; varargs;
  external 'msvcrt.dll';

function ZStartTime(var StartTime: Int64): Boolean;
begin
  Result := QueryPerformanceCounter(StartTime);
end;

function ZStopTime(const StartTime: Int64): AnsiString;
var
  iCounterPerSec, StopTime: Int64;
  time: Single;
begin
  if QueryPerformanceCounter(StopTime) then
  begin
    if QueryPerformanceFrequency(iCounterPerSec) then
    begin

      time := (0 - StartTime + StopTime) / iCounterPerSec;

      Result := '';
      SetLength(Result, 25);

      SetLength(Result, sprintf(PAnsiChar(Result), 'Result: %f sec.', time));
    end
    else
      Result := 'Error[ZStopTime(QueryPerformanceFrequency)]';
  end
  else
    Result := 'Error[ZStopTime(QueryPerformanceCounter)]';
end;

function base64_encode(const str: string): string;
const
  table: PWideChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
type
  PArrayChars = ^TArrayChars;
  TArrayChars = array of Char;
  TArrayBytes = array of Byte;
var
  len, i, r, j: Integer;
  f: TArrayBytes;
  c: PWideChar;
  bb: Char;
begin
  j := 0;
  r := 0;
  len := Length(str);

  SetLength(f, len * 3);

  c := Pointer(str);
  bb := c[0];
  while bb <> #0 do
  begin
    if WORD(bb) < 128 then
    begin
      f[j] := WORD(bb);
      inc(j);
    end
    else if WORD(bb) < 2048 then
    begin
      f[j] := ((WORD(bb) shr 6) or 192);
      f[j + 1] := ((WORD(bb) and 63) or 128);
      inc(j, 2);
    end
    else
    begin
      f[j] := (224 + (WORD(bb) shr 12));
      f[j + 1] := (128 + ((WORD(bb) shr 6) and 63));
      f[j + 2] := (128 + (WORD(bb) and 63));
      inc(j, 3);
    end;
    inc(r);
    bb := c[r];
  end;

  SetLength(Result, ((j + 2) div 3) * 4);

  i := 0;
  r := 0;
  while j >= 3 do
  begin
    PArrayChars(@Result)^[r + 0] := table[f[i] SHR 2];
    PArrayChars(@Result)^[r + 1] := table[((f[i] and 3) SHL 4) or (f[i + 1] SHR 4)];
    PArrayChars(@Result)^[r + 2] := table[((f[i + 1] and 15) SHL 2) or (f[i + 2] SHR 6)];
    PArrayChars(@Result)^[r + 3] := table[f[i + 2] and 63];
    inc(i, 3);
    inc(r, 4);
    dec(j, 3);
  end;

  case j of
    1:
      begin
        PArrayChars(@Result)^[r + 0] := table[f[i] SHR 2];
        PArrayChars(@Result)^[r + 1] := table[f[i] and 3 SHL 4];
        PArrayChars(@Result)^[r + 2] := '=';
        PArrayChars(@Result)^[r + 3] := '=';
      end;
    2:
      begin
        PArrayChars(@Result)^[r + 0] := table[f[i] SHR 2];
        PArrayChars(@Result)^[r + 1] := table[((f[i] and 3) SHL 4) or (f[i + 1] SHR 4)];
        PArrayChars(@Result)^[r + 2] := table[f[i + 1] and $0F SHL 2];
        PArrayChars(@Result)^[r + 3] := '=';
      end;
  end;
end;

var
  i: Cardinal;
  StartTime: Int64;

begin
 // 0K7QvdC40LrQvtC0ISDOtc+Bzr/inaTinaTOtc+Bzr/inaQ=
  Writeln(base64_encode('Юникод! &#949;&#961;&#959;&#10084;&#10084;&#949;&#961;&#959;&#10084;'));

  try
    if ZStartTime(StartTime) then
    begin
      for i := 0 to 10000000 do
      begin
        base64_encode('HytujkyHytujkyukHytujkyukuk');
      end;
      Writeln(ZStopTime(StartTime));
    end;

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.



Скажи пожалуйста, а кому уперлись в пень твои секунды ? Или ты за чистое искусство страдаешь ?

Для быстрого и качественного проекта - который хочет заработать привлекая этим своё внимание. Что за странный вопрос ?
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500709
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикУви, дорогой сэр. Это работает медленнее моего кода, плюс тоже не юникод. Сейчас обмозгую как его добавить в свой код, и скину пример
1. Мой вариант работает с памятью - ей пофиг, юникод или нет. А вот результат должен быть в AnsiString, а не в string, иначе смысла в кодировании нет (т.к. выходной буфер через один забит нулями).
2. Когда говоришь что что-то работает медленнее - надо бы доказательство приводить, хотя допускаю что такое может быть на очень старых процессорах, т.к. мой оптимизирован под Core i3 и выше.

Сравнение
результат на моём Core i7 26000JTQstC10L3QsNC00YbQsNGC0Ywg0L/QvtC/0YPQs9Cw0LXQsiDQt9Cw0LrQu9C10LLQsNC70Lgg0L/QuNGC0L7QvdCwIQ==
Няшик: Result: 2.444395 sec.
FAQyBDUEPQQwBDQERgQwBEIETAQgAD8EPgQ/BEMEMwQwBDUEMgQgADcEMAQ6BDsENQQyBDAEOwQ4BCAAPwQ4BEIEPgQ9BDAEIQA=
AsmB64: Result: 1.043641 sec.


Обрати внимание что результаты разные, потому что твой код перед кодированием ещё и модифицирует исходные данные (base64 вообще-то предназначен для передачи двоичных данных, модифицировать их перед передачей - это бред).
код теста
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
 ... выше всё без изменений ...

const
  StrToEncode: string = 'Двенадцать попугаев заклевали питона!';

var
  Encoded: AnsiString;
  StrByteSize: Integer;
begin
  try
    Writeln(base64_encode(StrToEncode));
    if ZStartTime(StartTime) then
    begin
      for i := 0 to 10000000 do
      begin
        base64_encode(StrToEncode);
      end;
      Writeln('Няшик: ' + ZStopTime(StartTime));
    end;
    StrByteSize := Length(StrToEncode) * SizeOf(Char);
    Base64Encode(StrByteSize, Pointer(StrToEncode), Encoded);
    Writeln(Encoded);
    if ZStartTime(StartTime) then
    begin
      for i := 0 to 10000000 do
      begin
        Base64Encode(StrByteSize, Pointer(StrToEncode), Encoded);
      end;
      Writeln('AsmB64: ' + ZStopTime(StartTime));
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.



schiСкажи пожалуйста, а кому уперлись в пень твои секунды ? Или ты за чистое искусство страдаешь ?Могу за себя сказать: изучал ассемблер в Delphi, в качестве "подопытного" выбрал base64 т.к. просто и понятно :)
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500713
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp1. Мой вариант работает с памятью - ей пофиг, юникод или нет. А вот результат должен быть в AnsiString, а не в string, иначе смысла в кодировании нет (т.к. выходной буфер через один забит нулями).


Бред, полный бред ! Скажу я тебе. Так как символ надо преобразовать в байтовую кодировку UTF-8

Например так, поддержка 6 байт

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
function base64_encode(const str: string): string;
const
  table: PWideChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
type
  PArrayChars = ^TArrayChars;
  TArrayChars = array of Char;
  TArrayBytes = array of Byte;
var
  len, i, r, j: Integer;
  f: TArrayBytes;
  c: PWideChar;
  bb: Char;
begin
  j := 0;
  r := 0;
  len := Length(str);

  SetLength(f, len * 3);

  c := Pointer(str);
  bb := c[0];
  while bb <> #0 do
  begin
    if (WORD(bb) < $00000080) then
    begin
      f[j] := WORD(bb);
      inc(j, 1);
    end
    else if (WORD(bb) < $00000800) then
    begin
      f[j] := $C0 or ((WORD(bb) shr 6) and $FF);
      f[j + 1] := $80 or (WORD(bb) and $3F);
      inc(j, 2);
    end
    else if (WORD(bb) < $00010000) then
    begin
      f[j] := $E0 or ((WORD(bb) shr 12) and $FF);
      f[j + 1] := $80 or ((WORD(bb) shr 6) and $3F);
      f[j + 2] := $80 or (WORD(bb) and $3F);
      inc(j, 3);
    end
    else if (WORD(bb) < $00200000) then
    begin
      f[j] := $F0 or ((WORD(bb) shr 18) and $FF);
      f[j + 1] := $80 or ((WORD(bb) shr 12) and $3F);
      f[j + 2] := $80 or ((WORD(bb) shr 6) and $3F);
      f[j + 3] := $80 or (WORD(bb) and $3F);
      inc(j, 4);
    end
    else if (WORD(bb) < $04000000) then
    begin
      f[j] := $F8 or ((WORD(bb) shr 24) and $FF);
      f[j + 1] := $80 or ((WORD(bb) shr 18) and $3F);
      f[j + 2] := $80 or ((WORD(bb) shr 12) and $3F);
      f[j + 3] := $80 or ((WORD(bb) shr 6) and $3F);
      f[j + 4] := $80 or (WORD(bb) and $3F);
      inc(j, 5);
    end
    else if (WORD(bb) < $80000000) then
    begin
      f[j] := $FC or ((WORD(bb) shr 30) and $FF);
      f[j + 1] := $80 or ((WORD(bb) shr 24) and $3F);
      f[j + 2] := $80 or ((WORD(bb) shr 18) and $3F);
      f[j + 3] := $80 or ((WORD(bb) shr 12) and $3F);
      f[j + 4] := $80 or ((WORD(bb) shr 6) and $3F);
      f[j + 5] := $80 or (WORD(bb) and $3F);
      inc(j, 6);
    end;
    inc(r);
    bb := c[r];
  end;

  SetLength(Result, ((j + 2) div 3) * 4);

  i := 0;
  r := 0;
  while j >= 3 do
  begin
    PArrayChars(@Result)^[r + 0] := table[f[i] SHR 2];
    PArrayChars(@Result)^[r + 1] := table[((f[i] and 3) SHL 4) or (f[i + 1] SHR 4)];
    PArrayChars(@Result)^[r + 2] := table[((f[i + 1] and 15) SHL 2) or (f[i + 2] SHR 6)];
    PArrayChars(@Result)^[r + 3] := table[f[i + 2] and 63];
    inc(i, 3);
    inc(r, 4);
    dec(j, 3);
  end;

  case j of
    1:
      begin
        PArrayChars(@Result)^[r + 0] := table[f[i] SHR 2];
        PArrayChars(@Result)^[r + 1] := table[f[i] and 3 SHL 4];
        PArrayChars(@Result)^[r + 2] := '=';
        PArrayChars(@Result)^[r + 3] := '=';
      end;
    2:
      begin
        PArrayChars(@Result)^[r + 0] := table[f[i] SHR 2];
        PArrayChars(@Result)^[r + 1] := table[((f[i] and 3) SHL 4) or (f[i + 1] SHR 4)];
        PArrayChars(@Result)^[r + 2] := table[f[i + 1] and $0F SHL 2];
        PArrayChars(@Result)^[r + 3] := '=';
      end;
  end;
end;



"С памятью" Я ржу
Т.е в коде мы с памятью не можем работать?


Мой пример тот выдаёт 0,9 сек а твой 1,1 ... Вся твоя быстрота не обоснованная.

alekcvp[spoiler Сравнение]


Я верю тебе, верю! А теперь в настройках галочку оптимизации пожалуйста включи, и проверь снова. И увидишь что мой пример будет во много раз быстрее.

Иж какой.


alekcvpМогу за себя сказать: изучал ассемблер в Delphi, в качестве "подопытного" выбрал base64 т.к. просто и понятно :)


Практика такова что ты не напишешь в современных Delphi на ассемблере лучше чем компилятор оптимизирует. Многие знатоки на этом форуме это подтвердят.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500714
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpНяшик: Result: 2.444395 sec.

AsmB64: Result: 1.043641 sec.


Если твой код на I3 так плохо работает, если на моём процессоре тоже за 1 секунду отрабатывает. А он кстати 2009 года
https://ark.intel.com/ru/products/42771/Intel-Celeron-Processor-E3300-1M-Cache-2_50-GHz-800-MHz-FSB

То твой код ещё хуже моего, мой то работает быстрее с включённой галочкой.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500715
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpМогу за себя сказать: изучал ассемблер в Delphi, в качестве "подопытного" выбрал base64 т.к. просто и понятно :)

https://github.com/aklomp/base64

уже есть :)
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500719
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикПрактика такова что ты не напишешь в современных Delphi на ассемблере лучше чем компилятор оптимизирует. Многие знатоки на этом форуме это подтвердят.

Увы, у тебя слишком сильная вера в возможности оптимизации дельфийского компилятора. Особенно для 64-битной платформы.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500722
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiНяшикПрактика такова что ты не напишешь в современных Delphi на ассемблере лучше чем компилятор оптимизирует. Многие знатоки на этом форуме это подтвердят.

Увы, у тебя слишком сильная вера в возможности оптимизации дельфийского компилятора. Особенно для 64-битной платформы.

Я не пользуюсь этой версией компилятора, про неё ничего сказать не могу. Но вот для 86-32 битного разницы нету. Дельфовый компилятор ляпает код гораздо лучше чем его напишет человек, не раз уже в этом убеждался.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500724
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикБред, полный бред ! Скажу я тебе. Так как символ надо преобразовать в байтовую кодировку UTF-8

Ещё раз, читай по буквам: wikiBase64 буквально означает — позиционная система счисления с основанием 64. Здесь 64 — это число символов в алфавите кодирования, из которого формируется конечный буквенно-цифровой текст на основе латинского алфавита. Число соответствует наибольшей степени двойки (26), которая может быть представлена с использованием печатных символов ASCII. Эта система широко используется в электронной почте для представления бинарных файлов в тексте письма (транспортное кодирование).
Какое нафиг преобразование исходных данных, если они по-умолчанию двоичные и их надо передать "как есть" и восстановить на другом конце один-в-один?..
НяшикТ.е в коде мы с памятью не можем работать?
Ладно, для редких военных профессий: мой код принимает указатель на буфер в памяти и размер данных в нём, ему пофиг что там - текст, музыка или картинка с котиками: он все преобразует как есть.
НяшикМой пример тот выдаёт 0,9 сек а твой 1,1 ... Вся твоя быстрота не обоснованная.
А теперь в настройках галочку оптимизации пожалуйста включи, и проверь снова.

Ты вот про эту галочку?..

А чтобы нормально сравнить - запусти мой пример, с русским текстом. Потому что я не удивлюсь, если ты у себя в тесте написал что-то вроде:
Код: pascal
1.
2.
3.
4.
for i := 1 to 1000000 do 
begin
  base64encode(length(s)*2, PChar(s), result);
end;


НяшикПрактика такова что ты не напишешь в современных Delphi на ассемблере лучше чем компилятор оптимизирует. Многие знатоки на этом форуме это подтвердят.
Вот как раз в современных Delphi с оптимизацией всё плохо, в отличие от старых. Иногда они такие куски лишнего кода генерят, что за голову схватиться хочется. Хотя, справедливости ради, это чаще всего качается inline-функций.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500725
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500728
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi https://github.com/aklomp/base64
уже есть :)
Ещё б кто мне подсказал как .c напрямую в проект дельфей линковать без пляски с .obj и .dll.
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500729
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшикschiпропущено...


Увы, у тебя слишком сильная вера в возможности оптимизации дельфийского компилятора. Особенно для 64-битной платформы.

Я не пользуюсь этой версией компилятора, про неё ничего сказать не могу. Но вот для 86-32 битного разницы нету. Дельфовый компилятор ляпает код гораздо лучше чем его напишет человек, не раз уже в этом убеждался.

Я убеждался в обратном. Да и Саша Шарахов не зря куски FastCode на ассемблере писал.

По поводу 64-битного компилятора:
http://blog.digitaltundra.com/?p=296
...
Рейтинг: 0 / 0
BASE64-HMAC-SHA384
    #39500736
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpЕщё раз, читай по буквам:


Ты реально не понимаешь? Речь идёт о символах, которые нужно перевести в base64 Например смайлик сердечко это 3 байта, этих три байта надо разбить так, и перевести в base
Код: pascal
1.
2.
3.
      f[j] := $E0 or ((WORD(bb) shr 12) and $FF);
      f[j + 1] := $80 or ((WORD(bb) shr 6) and $3F);
      f[j + 2] := $80 or (WORD(bb) and $3F);



Т.е один юникодный символ ❤ займёт ровно 3 байта, которые должны быть сохранены в base64 вот так

Код: pascal
1.
2.
3.
4.
    PArrayChars(@Result)^[r + 0] := table[f[i] SHR 2];
    PArrayChars(@Result)^[r + 1] := table[((f[i] and 3) SHL 4) or (f[i + 1] SHR 4)];
    PArrayChars(@Result)^[r + 2] := table[((f[i + 1] and 15) SHL 2) or (f[i + 2] SHR 6)];
    PArrayChars(@Result)^[r + 3] := table[f[i + 2] and 63];





Всё ниже не вижу смысла комментировать, я уже объяснил.

alekcvpТы вот про эту галочку?..


Да про эту. У тебя комп забит муссором от майл - ру ?)))


alekcvp
А чтобы нормально сравнить - запусти мой пример, с русским текстом.


Смысл запускать то что не работает?)


IARDBEEEQQQ6BDgEOQQgAEIENQQ6BEEEQgQ=
0PPx8ero6SDy5erx8gAAAAAAAAAAAAAAAAA=
IARDBEEEQQQ6BDgEOQQgAEIENQQ6BEEEQgQ=



alekcvpВот как раз в современных Delphi с оптимизацией всё плохо, в отличие от старых. Иногда они такие куски лишнего кода генерят, что за голову схватиться хочется. Хотя, справедливости ради, это чаще всего качается inline-функций.

Согласен если плохо программируешь.
...
Рейтинг: 0 / 0
25 сообщений из 66, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / BASE64-HMAC-SHA384
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]