Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.07.2017, 14:17   #1
garrygarry
Пользователь
 
Регистрация: 23.01.2014
Сообщений: 36
По умолчанию hex to ascii проблема с нулем

Помогите с нулем разобраться.. Проблема с нулями , если заменить их
чемть, то все декодируется нормально, в противном случае обрезается



Код:
include  \masm32\include\windows.inc
include  \masm32\include\kernel32.inc
include  \masm32\include\user32.inc
include  \masm32\include\masm32.inc

includelib  \masm32\lib\kernel32.lib
includelib  \masm32\lib\user32.lib
includelib  \masm32\lib\masm32.lib
hextoa	proto :ptr byte
.data
result db "!!!",0
hh dd ?
bytesmaska dd ?

cpt   db "Result ASCII:" , 0
input db "1234567776567576786887865750000765765675765675756756756776576576",0

.data?
output   db 4096 dup(?) ; total converted string
mybuffer db 4096 dup(?) ; total converted string
.code

start:

; ----------------------------------------------------------------------
; Convert hex string to DWORD with result in the EAX register
; ----------------------------------------------------------------------
invoke hextoa,addr input

invoke lstrcpy, ADDR output , ADDR input


invoke MessageBox, NULL, addr output , addr cpt, MB_OK

invoke CreateFile,addr  result,                ;создаем файл
            GENERIC_WRITE,
            0,
            NULL,
            CREATE_NEW,
            FILE_ATTRIBUTE_NORMAL,
            NULL
      
      mov hh,eax

invoke	WriteFile, hh, addr output,32, addr bytesmaska, 0
invoke CloseHandle, hh

invoke ExitProcess, NULL
hextoa	proc uses esi edi string:ptr byte
	mov edi,string
	mov esi,edi
	.repeat
	    mov ax,[esi]
	    inc esi
	    .continue .if al == ' '
	    inc esi
	    mov dl,ah
	    .break .if !ax 
	    sub ax,'00'
	    .if al > 9
		sub al,7
	    .endif
	    shl al,4
	    .if ah > 9
		sub ah,7
	    .endif
	    or  ah,al
	    mov [edi],ah
	    inc edi
	.until !dl
	sub al,al
	mov [edi],al
	mov eax,string
	ret
hextoa endp
end start
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось garrygarry; 20.07.2017 в 14:33.
garrygarry вне форума Ответить с цитированием
Старый 20.07.2017, 15:28   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

garrygarry,
Цитата:
Проблема с нулями , если заменить их чемть, то все декодируется нормально
О каких "нулях" речь? В какой строке "нули" меняют на "чемть"?
Mikl___ вне форума Ответить с цитированием
Старый 20.07.2017, 17:34   #3
garrygarry
Пользователь
 
Регистрация: 23.01.2014
Сообщений: 36
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
garrygarry,
О каких "нулях" речь? В какой строке "нули" меняют на "чемть"?

Если в "input"е

746573742d746573742d746573742d74657 374 все ок - выведет "test-test..."

но если

7465000073742d746573742d746573742d7 4657374
^^^^^^^^^^^

то будет "te" и все

А хочется te st-test-test-test
[два нуля, в смысле, два пробела]

Последний раз редактировалось garrygarry; 21.07.2017 в 08:09.
garrygarry вне форума Ответить с цитированием
Старый 20.07.2017, 22:47   #4
garrygarry
Пользователь
 
Регистрация: 23.01.2014
Сообщений: 36
По умолчанию

[QUOTE=garrygarry;1691841]Если в "input"е

746573742d746573742d746573742d74657 374 все ок - выведет "test-test..."

но если

7465000073742d746573742d746573742d7 4657374
^^^^^^^^^^^

то будет "te" и все

А хочется te st-test-test-test
[два нуля, в смысле, два пробела]



Никто не поможет?

Последний раз редактировалось garrygarry; 21.07.2017 в 08:09.
garrygarry вне форума Ответить с цитированием
Старый 21.07.2017, 05:11   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

garrygarry,
символ "t" = ASCII 74h
символ "e" = ASCII 65h
символ " " = ASCII 20h, а не 00
Mikl___ вне форума Ответить с цитированием
Старый 21.07.2017, 09:10   #6
garrygarry
Пользователь
 
Регистрация: 23.01.2014
Сообщений: 36
По умолчанию

Хотел написать программу, которая читает по 25 байт hex строку и декодирует в asciii. А на данных нулях строка прерывается, не декодируется hex -> ascii.
Саму функцию нашел на просторах инета, а как его подправить ума не приложу
garrygarry вне форума Ответить с цитированием
Старый 21.07.2017, 09:22   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Найдите на просторах инета книжку по асму или словарб по английском и попробуйте перевести break if... Может натолкнет на мысль. Только граничное условие тогда надо менять.
p51x на форуме Ответить с цитированием
Старый 21.07.2017, 09:31   #8
garrygarry
Пользователь
 
Регистрация: 23.01.2014
Сообщений: 36
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Найдите на просторах инета книжку по асму или словарб по английском и попробуйте перевести break if... Может натолкнет на мысль. Только граничное условие тогда надо менять.
Мысль такая есть, только вот условием проблемы.. Скинул рабочий код. С обратной реализацией нет проблем (тоже нашел на просторах..), а вот здесь..
garrygarry вне форума Ответить с цитированием
Старый 21.07.2017, 09:33   #9
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

garrygarry,
а твоя программа не знает, что у строки длина 25 байт, зато считает концом строки первый встретившийся нулевой байт, поэтому и предсказуемый результат
Цитата:
Сообщение от garrygarry Посмотреть сообщение
"te" и все
и воспользуйся советом p51x
А почему не заменил 00 на 20 как я в #5 посоветовал, тогда и будет "te st-test-test-test"

Последний раз редактировалось Mikl___; 21.07.2017 в 09:38.
Mikl___ вне форума Ответить с цитированием
Старый 21.07.2017, 09:44   #10
garrygarry
Пользователь
 
Регистрация: 23.01.2014
Сообщений: 36
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
garrygarry,
а твоя программа не знает, что у строки длина 25 байт, зато считает концом строки первый встретившийся нулевой байт, поэтому и предсказуемый результат
и воспользуйся советом p51x
А почему не заменил 00 на 20 как я в #5 посоветовал, тогда и будет "te st-test-test-test"
Простите, может что-то смешное скажу, менял..

.continue .if al == 20

нет

насколько понимаю, конец строки 23,10.. Только в данном примере не знаю как реализовать.. Если б файл читать и курсорчик двигать setfileпоинтером.. другое дело

Последний раз редактировалось garrygarry; 21.07.2017 в 09:49.
garrygarry вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из ASCII в HEX GrabbeR Общие вопросы Delphi 2 18.03.2017 00:30
Проблема с переводом HEX в BIN ruby25 Visual C++ 0 09.02.2015 23:28
file->HEX HEX->BIN kakawkin Общие вопросы Delphi 1 25.04.2012 01:02
перевести из ASCII в HEX fize Помощь студентам 7 25.12.2009 15:35
Перевод символов в hex(ASCII table) Beliuk Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 02.11.2009 08:25