Пытаюсь на фасме считать файл, закодировать в бейз64 и передать на сервер Проблема в том что правильно кодируются лишь первые n байт (26 получилось у меня) саму процу бейз64 взял из пинча Код (Text): proc Base64Encode, lpSrc, lpDst, dwSrcLen mov esi, [lpSrc] mov edi, [lpDst] mov ecx, [dwSrcLen] xor ebx, ebx @l: jecxz @b64_ret lodsb shl eax, 16 cmp ecx, 1 jz @work lodsb shl ax, 8 cmp ecx, 2 jz @work lodsb @work: ; Output b64 quad mov edx, eax ror edx, 24 push ecx push 4 pop ecx @l2: call @b64_write loop @l2 pop ecx inc ebx cmp ebx, 18 jne endif xor ebx, ebx mov ax, 0a0dh stosw endif: sub ecx, 3 jns @l ; Pad neg ecx sub edi, ecx mov al, '=' rep stosb @b64_ret: ret nop ret @b64_write: rol edx, 6 mov eax, edx and al, 00111111b cmp al, 62 jae @write_spec cmp al, 52 jae @write_number ; Uppercase add al, 'A' cmp al, 'A'+26 jb @write ; Lowercase add al, 6 jmp @write ; Number @write_number: add al, '0'-52 jmp @write ; Special: +/ @write_spec: sub al, 62 shl al, 2 add al, 43 @write: stosb retn endp 2 буффера размером 65535 байт, число символов беру как SizeReadWrite из считанного файла Прямо из ольки копирую буффер, перевожу и файлы не совпадают, также у моего меньший размер Никто не сталкивался с подобным?
т.е. ты хочешь, чтобы мы глянули на сорцы пинча и сказали, чем твоя собственная функция отличается, при этом ее код ты не показываешь???
MSoft, ok Код (Text): format PE GUI 5.0 include '%fasminc%\win32ax.inc' section '.code' code writeable readable executable hFile dd ? hMemory dd ? hMemory2 dd ? pMemory dd ? pMemory2 dd ? SizeReadWrite dd ? filename db 'C:\file.rar',0 entry $ invoke CreateFile, filename,GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,\ NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL mov [hFile],eax invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,65535 mov [hMemory],eax invoke GlobalLock,eax mov [pMemory],eax invoke ReadFile,[hFile], [pMemory], 65534, SizeReadWrite,NULL invoke CloseHandle,[hFile] invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,65535 mov [hMemory2],eax invoke GlobalLock,eax mov [pMemory2],eax push [SizeReadWrite] push [pMemory2] push [pMemory] call Base64Encode invoke ExitProcess, 0 proc Base64Encode, lpSrc, lpDst, dwSrcLen mov esi, [lpSrc] mov edi, [lpDst] mov ecx, [dwSrcLen] xor ebx, ebx @l: jecxz @b64_ret lodsb shl eax, 16 cmp ecx, 1 jz @work lodsb shl ax, 8 cmp ecx, 2 jz @work lodsb @work: ; Output b64 quad mov edx, eax ror edx, 24 push ecx push 4 pop ecx @l2: call @b64_write loop @l2 pop ecx inc ebx cmp ebx, 18 jne endif xor ebx, ebx mov ax, 0a0dh stosw endif: sub ecx, 3 jns @l ; Pad neg ecx sub edi, ecx mov al, '=' rep stosb @b64_ret: ret nop ret @b64_write: rol edx, 6 mov eax, edx and al, 00111111b cmp al, 62 jae @write_spec cmp al, 52 jae @write_number ; Uppercase add al, 'A' cmp al, 'A'+26 jb @write ; Lowercase add al, 6 jmp @write ; Number @write_number: add al, '0'-52 jmp @write ; Special: +/ @write_spec: sub al, 62 shl al, 2 add al, 43 @write: stosb retn endp section '.import' import readable writable library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL' include '%fasminc%\API\kernel32.inc' include '%fasminc%\API\user32.inc'
asmfan не понял намека? ) неправильно реализована сама функция? все дело в том что какая то часть всеже кодируется правильно и мне кажется косяк всетки гдето у меня... А офф доку всеже прочту
2FED, спасибо, но уже выяснил что не так: дело в самой реализации алго посему решил забить на бейз и сделал в гексе