|
|
| Посл.отвђт | Сообщен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 |