Не работает проц-а для Base 64 encoding

Тема в разделе "WASM.BEGINNERS", создана пользователем gershkovich, 21 ноя 2006.

  1. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Всем привет!

    Отправляю почту с атачментом. Для кодирования файла в Base64
    использую проц-у описанную в статье
    http://wasm.ru/article.php?article=simplesmtp

    Вот код:
    Код (Text):
    1. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    2. ; base64 encoder without dictionary by RT Fishel
    3. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    4. proc Base64Encode lpSrc, lpDst, dwstrlen
    5.         push        esi edi edx ebx
    6.                      
    7.         mov         esi, [lpSrc]
    8.         mov         edi, [lpDst]
    9.         mov         ebx, dword [dwstrlen]
    10.         call        b64.encode
    11.  
    12.         ; Return the address of last byte
    13.         mov         eax, edi
    14.  
    15.         pop         ebx edx edi esi
    16.         ret
    17.  
    18.  
    19.   b64:      
    20.     .newline:
    21.         call        b64.store_crlf
    22.                      
    23.     .encode:
    24.         push        (76 shr 2) + 1
    25.         pop         edx
    26.                      
    27.     .outer:    
    28.         dec         edx
    29.         je          b64.newline
    30.         lodsd
    31.         dec         esi
    32.         inc         ebx
    33.         bswap       eax
    34.         mov         ecx, 4
    35.                      
    36.     .inner:    
    37.         rol         eax, 6
    38.         and         al, 3Fh
    39.         cmp         al, 3Eh
    40.         jb          b64.testchar
    41.         shl         al, 2
    42.         sub         al, ((3Eh shl 2) + 'A' - '+') and 0FFh
    43.                      
    44.     .testchar:
    45.         sub         al, 4
    46.         cmp         al, '0'
    47.         jnl         b64.store
    48.         add         al, 'A' + 4
    49.         cmp         al, 'Z'
    50.         jbe         b64.store
    51.         add         al, 'a' - 'Z' - 1
    52.                      
    53.     .store:    
    54.         stosb
    55.         dec         ebx
    56.         loopne      b64.inner
    57.         jne         b64.outer
    58.         mov         al, '='
    59.         rep         stosb
    60.         xor         al, al
    61.         stosb
    62.         ret
    63.  
    64.     .store_crlf:
    65.         mov         ax, 0a0dh
    66.         stosw
    67.                      
    68.         ret
    69. endp
    Но это проц-а неправильно кодирует !!!
    Для кодирования логина и пароля все работает
    а с файлом получается полная лажа

    Атачмент если и получается закодировать, то приходит кривой
    (архивы например не открываются)

    Что не так ?
    Проц-а кривая или у меня руки ?

    Заранее спасибо.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    gershkovich
    Уже была ведь такая тема и тебе ответили.
     
  3. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    С той проблемой я разобрался.
    Все заработало. Письма отправляются.
    Но атачи приходят кривые.

    А это уже другая проблема.
    Алгоритм неправильно работает - после кодирования
    в теле встречаются нули (хотя, как я понимаю, их не должно быть)

    Иногда вообще просто зависает
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    На выходе должны быть только печатные символы:
    Прогони этой функцией сжатый раром архив на несколько мб и посмотри данные. Можешь в WinHex по F2, он покажет встречающиеся байты. Если есть ошибки, значит, выкинь функцию и возьми работающую (на сайте в сорцах есть).
     
  5. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Нашел в чем проблема

    Перед выходом записывается завершающий ноль:
    Код (Text):
    1. xor al, al
    2. stosb
    3. ret
    который и портил мне всю малину.

    Автор кода почему то решил, что финальный ноль всегда нужен.
    Тем не менее спасибо ему (автору) большое!

    Т.е. проц-а работает как-надо!