base64 - Quantum lib

Тема в разделе "WASM.WIN32", создана пользователем irrona, 16 авг 2004.

Статус темы:
Закрыта.
  1. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    Вопрос скорее к создателю



    Вот пример проги для конвертации содержимого файла в base64 и записи результата в другой:
    Код (Text):
    1.  
    2. .486
    3. .model flat, stdcall
    4. option casemap:none
    5.  
    6.     include windows.inc
    7.     include kernel32.inc
    8.     include base64.inc
    9.    
    10.     includelib kernel32.lib
    11.     includelib base64.lib
    12.    
    13.     Main proto
    14.    
    15. .data
    16.     AppName db "My Application",0
    17.     fileName db "path\test.txt",0
    18.     new_fileName db "path\test.txt.base",0
    19.     buffer1 dd 0
    20.     buffer2 dd 0
    21.  
    22. .data?
    23.     hInstance   HINSTANCE ?
    24.     hFile dd ?
    25.     hFile_New dd ?
    26.     SizeR dd ?
    27.     SizeW dd ?
    28.     hMemory dd ?
    29.     memoryOffset dd ?
    30.    
    31. .code
    32. start:
    33.  
    34.     invoke GetModuleHandle,NULL
    35.     mov hInstance,eax
    36.     invoke Main
    37.     invoke ExitProcess,eax
    38.    
    39. Main proc
    40. LOCAL readed:DWORD
    41. LOCAL writed:DWORD
    42.  
    43.     invoke CreateFile,addr fileName,GENERIC_READ,0,NULL,OPEN_EXISTING,NULL,NULL
    44.     mov hFile,eax
    45.     invoke GetFileSize,hFile,NULL
    46.     mov SizeR,eax
    47.     mov ecx,3
    48.     mul ecx
    49.     shr eax,1
    50.     inc eax
    51.     mov SizeW,eax
    52. ;    invoke GlobalAlloc,GHND,SizeR
    53. ;    mov hMemory,eax
    54. ;    invoke GlobalLock,hMemory
    55. ;    mov memoryOffset,eax
    56.     invoke ReadFile,hFile,offset buffer1,SizeR,addr readed,0
    57.     invoke CloseHandle,hFile
    58.     invoke b64_encode,offset buffer1,offset buffer2
    59.     invoke CreateFile,addr new_fileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,NULL,NULL
    60.     mov hFile_New,eax
    61.     invoke WriteFile,hFile_New,offset buffer2,SizeW,addr writed,0
    62.     invoke CloseHandle,hFile_New
    63. ;    invoke GlobalUnlock,memoryOffset
    64. ;    invoke GlobalFree,hMemory
    65.  
    66.     xor eax,eax
    67.     ret
    68. Main endp
    69.  
    70. end start
    71.  




    В результате содержимое первой переменной затирается при конвертации и во вторую переменную попадают неверные данные. При использовании блока памяти вместо первой переменной, либо при конвертации блока памяти самого на себя, происходит примерно тоже самое.Выход в использовании байтовых переменных заданного размера.Но это меня не устраивает,т.к. заранее размер входного файла неизвестен.Возможно есть другие варианты???
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    irrona



    Буфер должен иметь размер файла, как минимум:

    buffer1 db 1024 dup (0)

    buffer2 db 1024 dup (0)

    Если фиксированный размер не устраивает, то можно использовать heap (GlobalAlloc, HeapAlloc, ...) или MMF (File Mapping).



    Кстати, тут недавно обсуждались баги в моей либе... Исправленный вариант отправлен Киндеру, но на сайте ещё не появился. Ждём-с.
     
  3. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    Quantum

    Можно адрес сайта?
     
  4. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    Вот с использованием MMF:
    Код (Text):
    1.  
    2. .486
    3. .model flat, stdcall
    4. option casemap:none
    5.  
    6.     include windows.inc
    7.     include kernel32.inc
    8.     include base64.inc
    9.    
    10.     includelib kernel32.lib
    11.     includelib base64.lib
    12.    
    13.     Main proto
    14.    
    15. .data
    16.     AppName db "My Application",0
    17.     mystr db 100 dup(?)
    18.     format db "%d",0
    19.    
    20.     fileName db "path\test.txt",0
    21.     new_fileName db "path\test.base",0
    22.  
    23. .data?
    24.     hInstance   HINSTANCE ?
    25.     hFile dd ?
    26.     hFile_New dd ?
    27.     SizeR dd ?
    28.     SizeW dd ?
    29.     hInMap dd ?
    30.     hOutMap dd ?
    31.     pIn dd ?
    32.     pOut dd ?
    33.    
    34. .code
    35. start:
    36.  
    37.     invoke GetModuleHandle,NULL
    38.     mov hInstance,eax
    39.     invoke Main
    40.     invoke ExitProcess,eax
    41.    
    42. Main proc
    43. LOCAL readed:DWORD
    44. LOCAL writed:DWORD
    45.  
    46.     ;Отображение входного файла
    47.     invoke CreateFile,addr fileName,GENERIC_READ,FILE_SHARE_READ,NULL,\
    48.         OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,NULL
    49.     mov hFile,eax
    50.     invoke GetFileSize,hFile,NULL
    51.     mov SizeR,eax
    52.     mov ecx,3
    53.     mul ecx
    54.     shr eax,1
    55.     inc eax
    56.     mov SizeW,eax
    57.     invoke CreateFileMapping,hFile,NULL,PAGE_READONLY,0,SizeR,NULL
    58.     mov hInMap,eax
    59.     invoke MapViewOfFile,hInMap,FILE_MAP_READ,0,0,SizeR
    60.     mov pIn,eax
    61.    
    62.     ;Отображение выходного файла
    63.     invoke CreateFile,addr new_fileName,GENERIC_READ or GENERIC_WRITE,0,\
    64.         NULL,CREATE_ALWAYS,FILE_FLAG_NO_BUFFERING,NULL
    65.     mov hFile_New,eax
    66.     invoke CreateFileMapping,hFile_New,NULL,PAGE_READWRITE,0,SizeW,NULL
    67.     mov hOutMap,eax
    68.     invoke MapViewOfFile,hOutMap,FILE_MAP_WRITE,0,0,SizeW
    69.     mov pOut,eax
    70.    
    71.     ;конвертация в base64
    72.     invoke b64_encode,pIn,pOut
    73.    
    74.     ;Освобождение ресурсов
    75.     invoke UnmapViewOfFile,pIn
    76.     invoke UnmapViewOfFile,pOut
    77.     invoke CloseHandle,hInMap
    78.     invoke CloseHandle,hOutMap
    79.     invoke CloseHandle,hFile
    80.     invoke CloseHandle,hFile_New
    81.  
    82.     xor eax,eax
    83.     ret
    84. Main endp
    85.  
    86. end start
    87.  




    Одно БОЛЬШОЕ НО!!! Пример просто отлично работает с файлами,содержащими ascii,с бинарными файлами,увы,ничего не получается.Еще предложения???
     
  5. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    Quantum

    В общем я прогнал твою процедуру в дебаге и пару инструкций поменял.Дело в том,что ты в цикле,при загрузке очередного байта,проверяешь не равен ли он нулю.Поэтому с ascii файлами все проходит,т.к. в них нулевой байт встречается только в конце файла.С бинарниками такое не проходит.Поэтому я добавил третий параметр - длина входной строки - и в цикле проверку на обнуление ecx.

    Короче теперь она глотает любые файлы.Проверено на ascii файлах(txt,asm,vbs)и на бинарных(doc,xls,exe,com,jpg,gif)

    Вот пример проги с включенной исправленной процедурой.

    В азхиве есть decode.com, позволяющий проверить результат работы декодированием полученного файла. Пользовать нужно так: decode < test.base > test.new - где test.base закодированный файл; test.new - раскодированный файл.

    Спасибо за ответы и помощь.







    [​IMG] _1952561221__base64_encode.rar
     
Статус темы:
Закрыта.