· Начало · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› base64 - Quantum lib

Посл.отвђт Сообщенiе


Дата: Авг 16, 2004 18:11:17

Вопрос скорее к создателю

Вот пример проги для конвертации содержимого файла в base64 и записи результата в другой:
.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


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


Дата: Авг 16, 2004 19:00:11

irrona
„buffer1 dd 0
buffer2 dd 0“

Буфер должен иметь размер файла, как минимум:
buffer1 db 1024 dup (0)
buffer2 db 1024 dup (0)
Если фиксированный размер не устраивает, то можно использовать heap (GlobalAlloc, HeapAlloc, ...) или MMF (File Mapping).

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


Дата: Авг 17, 2004 04:17:48

Quantum
Можно адрес сайта?


Дата: Авг 17, 2004 11:28:08

Вот с использованием MMF:
.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,с бинарными файлами,увы,ничего не получается.Еще предложения???


Дата: Авг 18, 2004 09:38:44

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