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

Base64 Encode
  #2  
Старый 12.12.2006, 22:57
hidden
Постоянный
Регистрация: 23.04.2006
Сообщений: 622
Провел на форуме:
5887054

Репутация: 1292


По умолчанию Base64 Encode

Алгоритм: Base64 Encode
Синтаксис: fasm
Описание: rfc2045.txt
Коментарий: Вот решил переписать алгоритм по своему, оптимизировать и т.д. после этого у меня сложилось впечатление что автор разработавший его смутно представлял основы написания програм на ассемблере, можно было сделать его намного быстрее, кстати кто нибудь задумывался что результат кодирования участка данных длиной пропорциональной выражению x*2 имеет 3 синонима, а x*2+1 целых 15, для примера выполни эту команду perl -e "print'OK'if(decode_base64('bWU=')eq decode_base64('bWX='));"
Пример вызова:
Код:
format PE GUI 4.0
entry start

include 'win32a.inc'

data import
  library USER32,'USER32.DLL'
  import  USER32,MessageBoxA,'MessageBoxA'
end data

include 'utils.inc'

start:
        stdcall bin2base64, bin, bin.len, chrset, buf
        ret
 chrset         db 'ABCDEFGHIJKLMNOP'
                db 'QRSTUVWXYZabcdef'
                db 'ghijklmnopqrstuv'
                db 'wxyz0123456789+/'

 bin            db 'This is my data'
 .len           = $ - bin
 buf            rb 256
Внимание: Длина буфера должна быть больше длины кодируемых данных в 4/3 раза c округлением в большую сторону + pad символ + символ конца строки, мы ведь не хотим переполнения буфера
Код:
Код:
proc bin2base64, data, len, chrset, base
        push    edx
        xchg    esi, [data]
        xchg    ecx, [len]
        xchg    ebx, [chrset]
        xchg    edi, [base]
        mov     eax, ecx
        xor     edx, edx
        lea     ecx, [edx+3]
        div     ecx
        mov     ecx, eax
        mov     al, dl
        ror     eax, 16
 .lop:  lodsb
        ror     ax, 2
        mov     dl, al
        and     dl, 63
        mov     al, [edx+ebx]
        stosb
        rol     ax, 10
        lodsb
        ror     ax, 4
        mov     dl, al
        and     dl, 63
        mov     al, [edx+ebx]
        stosb
        rol     ax, 12
        lodsb
        ror     ax, 6
        mov     dl, al
        and     dl, 63
        mov     al, [edx+ebx]
        stosb
        rol     ax, 6
        mov     dl, al
        and     dl, 63
        mov     al, [edx+ebx]
        stosb
        loop    .lop
        rol     eax, 16
        mov     cx, ax
        jcxz    .sz
        mov     eax, '==' shl 16
        lodsb
        ror     ax, 2
        mov     dl, al
        and     dl, 63
        mov     al, [edx+ebx]
        dec     cx
        jnz     @f
        shr     ah, 2
        mov     dl, ah
        mov     ah, [edx+ebx]
        stosd
        jmp     .sz
 @@:    stosb
        shr     eax, 8
        shl     ax, 2
        lodsb
        ror     ax, 4
        and     al, 63
        mov     dl, al
        and     dl, 63
        mov     al, [edx+ebx]
        shr     ah, 2
        mov     dl, ah
        mov     ah, [edx+ebx]
        stosd
 .sz:   xor     eax, eax
        stosb
 .lnd:  pop     edx
        mov     esi, [data]
        mov     ecx, [len]
        mov     ebx, [chrset]
        mov     edi, [base]
        ret
endp

Последний раз редактировалось hidden; 13.12.2006 в 00:18.. Причина: Придерживаться формата, относится для всех!
 
Ответить с цитированием