Вопрос скорее к создателю Вот пример проги для конвертации содержимого файла в base64 и записи результата в другой: Код (Text): .486 .model flat, stdcall option casemap:none include windows.inc include kernel32.inc include base64.inc includelib kernel32.lib includelib base64.lib Main proto .data AppName db "My Application",0 fileName db "path\test.txt",0 new_fileName db "path\test.txt.base",0 buffer1 dd 0 buffer2 dd 0 .data? hInstance HINSTANCE ? hFile dd ? hFile_New dd ? SizeR dd ? SizeW dd ? hMemory dd ? memoryOffset dd ? .code start: invoke GetModuleHandle,NULL mov hInstance,eax invoke Main invoke ExitProcess,eax Main proc LOCAL readed:DWORD LOCAL writed:DWORD invoke CreateFile,addr fileName,GENERIC_READ,0,NULL,OPEN_EXISTING,NULL,NULL mov hFile,eax invoke GetFileSize,hFile,NULL mov SizeR,eax mov ecx,3 mul ecx shr eax,1 inc eax mov SizeW,eax ; invoke GlobalAlloc,GHND,SizeR ; mov hMemory,eax ; invoke GlobalLock,hMemory ; mov memoryOffset,eax invoke ReadFile,hFile,offset buffer1,SizeR,addr readed,0 invoke CloseHandle,hFile invoke b64_encode,offset buffer1,offset buffer2 invoke CreateFile,addr new_fileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,NULL,NULL mov hFile_New,eax invoke WriteFile,hFile_New,offset buffer2,SizeW,addr writed,0 invoke CloseHandle,hFile_New ; invoke GlobalUnlock,memoryOffset ; invoke GlobalFree,hMemory xor eax,eax ret Main endp end start В результате содержимое первой переменной затирается при конвертации и во вторую переменную попадают неверные данные. При использовании блока памяти вместо первой переменной, либо при конвертации блока памяти самого на себя, происходит примерно тоже самое.Выход в использовании байтовых переменных заданного размера.Но это меня не устраивает,т.к. заранее размер входного файла неизвестен.Возможно есть другие варианты???
irrona Буфер должен иметь размер файла, как минимум: buffer1 db 1024 dup (0) buffer2 db 1024 dup (0) Если фиксированный размер не устраивает, то можно использовать heap (GlobalAlloc, HeapAlloc, ...) или MMF (File Mapping). Кстати, тут недавно обсуждались баги в моей либе... Исправленный вариант отправлен Киндеру, но на сайте ещё не появился. Ждём-с.
Вот с использованием MMF: Код (Text): .486 .model flat, stdcall option casemap:none include windows.inc include kernel32.inc include base64.inc includelib kernel32.lib includelib base64.lib Main proto .data AppName db "My Application",0 mystr db 100 dup(?) format db "%d",0 fileName db "path\test.txt",0 new_fileName db "path\test.base",0 .data? hInstance HINSTANCE ? hFile dd ? hFile_New dd ? SizeR dd ? SizeW dd ? hInMap dd ? hOutMap dd ? pIn dd ? pOut dd ? .code start: invoke GetModuleHandle,NULL mov hInstance,eax invoke Main invoke ExitProcess,eax Main proc LOCAL readed:DWORD LOCAL writed:DWORD ;Отображение входного файла invoke CreateFile,addr fileName,GENERIC_READ,FILE_SHARE_READ,NULL,\ OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,NULL mov hFile,eax invoke GetFileSize,hFile,NULL mov SizeR,eax mov ecx,3 mul ecx shr eax,1 inc eax mov SizeW,eax invoke CreateFileMapping,hFile,NULL,PAGE_READONLY,0,SizeR,NULL mov hInMap,eax invoke MapViewOfFile,hInMap,FILE_MAP_READ,0,0,SizeR mov pIn,eax ;Отображение выходного файла invoke CreateFile,addr new_fileName,GENERIC_READ or GENERIC_WRITE,0,\ NULL,CREATE_ALWAYS,FILE_FLAG_NO_BUFFERING,NULL mov hFile_New,eax invoke CreateFileMapping,hFile_New,NULL,PAGE_READWRITE,0,SizeW,NULL mov hOutMap,eax invoke MapViewOfFile,hOutMap,FILE_MAP_WRITE,0,0,SizeW mov pOut,eax ;конвертация в base64 invoke b64_encode,pIn,pOut ;Освобождение ресурсов invoke UnmapViewOfFile,pIn invoke UnmapViewOfFile,pOut invoke CloseHandle,hInMap invoke CloseHandle,hOutMap invoke CloseHandle,hFile invoke CloseHandle,hFile_New xor eax,eax ret Main endp end start Одно БОЛЬШОЕ НО!!! Пример просто отлично работает с файлами,содержащими ascii,с бинарными файлами,увы,ничего не получается.Еще предложения???
Quantum В общем я прогнал твою процедуру в дебаге и пару инструкций поменял.Дело в том,что ты в цикле,при загрузке очередного байта,проверяешь не равен ли он нулю.Поэтому с ascii файлами все проходит,т.к. в них нулевой байт встречается только в конце файла.С бинарниками такое не проходит.Поэтому я добавил третий параметр - длина входной строки - и в цикле проверку на обнуление ecx. Короче теперь она глотает любые файлы.Проверено на ascii файлах(txt,asm,vbs)и на бинарных(doc,xls,exe,com,jpg,gif) Вот пример проги с включенной исправленной процедурой. В азхиве есть decode.com, позволяющий проверить результат работы декодированием полученного файла. Пользовать нужно так: decode < test.base > test.new - где test.base закодированный файл; test.new - раскодированный файл. Спасибо за ответы и помощь. _1952561221__base64_encode.rar