Русский / Russian English / Английский

Сейчас на форуме: (+3 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Программирование —› ByteToHex
<< . 1 . 2 . 3 . 4 . 5 . >>
Посл.ответ Сообщение


Ранг: 760.1 (! !)
Статус: Участник
Student

Создано: 07 июля 2018 22:06 · Поправил: Isaev New!
Цитата · Личное сообщение · #1

Не подскажите максимально быстрый способ перевода? Помню во времена доса на асме буквально из десятка байт был финт для этого дела, может помнит кто?
А то дельфовый IntToHex(n, 2) сожрал всю скорость, посмотрев сырки стало сразу понятно куда)

А вообще нужно из md5 массива байт строку собрать
если делать влоб
Code:
  1. s:='';
  2. for i:=0 to 15 do
  3.   s:=s+IntToHex(Digest[i], 2);

то 10млн раз выполняются около 6 сек, хотелось бы поделить это время на 2 или 3... к слову, если вместо IntToHex просто добавлять '00', то будет 2 сек. Пробовал вместо простой конкатенации заюзать TStringBuilder, но нынче, похоже менеджер памяти уже сам вполне справляется с этим хламом и с ним только на 1 сек дольше получается. Так же пробовал выделить память сразу под всю строку и мувами загонять на места, но получается тоже дольше... в общем проблема только в переводе в hex, остальное, похоже достаточно оптимально работает




Ранг: 276.5 (наставник)
Статус: Участник

Создано: 10 июля 2018 22:34 · Поправил: f13nd New!
Цитата · Личное сообщение · #2

difexacaw пишет:
Вы реально знаете все эти наборы, что можите свободно их кодить o_0 ?

Для тех, кто пользуется отладчиком, в этом ничего сложного нет.

bizkitlimp пишет:
Надо поискать штуку, которая хотя бы эмулирует, SDE кажется, вслепую не осилю.

--> Link <--



Ранг: -0.7 (гость)
Статус: Участник

Создано: 10 июля 2018 22:42 New!
Цитата · Личное сообщение · #3

Crawler пишет: По-вашему, это связано с языком, а не с реализацией?

теперь перечитай мой пост на котором у тебя сработал триггер, и к тому же критически описывали сами создатели, у Страуструпа тоже много строк, как в сторону сишки, так и в сторону своего детища. если внимательно читать, можно заметить, что я пишу в прошедшем времени, с ресурсами в большинстве случаев нет проблем, хотя я натыкался когда компилятор не мог собрать проект.

Crawler пишет: Это всё бессодержательный пиздёж, я пока не увидел ни одного конкретного доказательства в виде конкретных замеров времени выполнения.

ты просто сказочный *, но отвечу в последний раз, надоело тратить время на необучаемого *.
посмотри на clang, это стандартный компилятор apple, который заменил gcc, после посмотри на другое их детище, swift, после посмотри выхлоп, когда насмотришься, в example добавь ошибки и посмотри на выхлоп сборки. тоже самое можешь проделать с rust. вот в c++ builder выхлоп будет хуже, там из-за специфики компонентной модели и совместимости, часть оптимизаций отключили. с\с++ отвратительно парсятся и еще хуже раскрутить логику на уровне компиляции, а с этим возникают проблемы со статическим анализатором кода. это не язык такой классный, это историческое наследие в виде миллиардов строк кода и того, что когда то язык начали продвигать мейнстримные на тот день компании, с точки зрения дизайна они отвратительны, D существенно лаконичней и логичней, но он никогда не взлетит, переписывать код никто не будет, это дорого, а постепенный переход бессмысленный, язык недалеко ушел от плюсов, лучше разу брать проблемно-ориентированный язык или что-то уровнем выше сишки с ди.



Ранг: 2.0 (гость)
Статус: Участник

Создано: 13 июля 2018 13:30 New!
Цитата · Личное сообщение · #4

Я лет 30 назад написал подпрограмму на основе просмотра BIOS IBM машины. По размеру она оптимальна, скорость можете проверить сами:
Byte2Hex proc
push ax
shr al,4
call Nible2Hex
pop ax
and al,0Fh
Nible2Hex proc
add al,90h
daa
adc al,40h
daa
stosb
ret
Nible2Hex endp
Byte2Hex endp

| Сообщение посчитали полезным: Isaev, dosprog


Ранг: 437.9 (мудрец)
Статус: Участник

Создано: 13 июля 2018 13:34 New!
Цитата · Личное сообщение · #5

Да, симпатично.




Ранг: 276.5 (наставник)
Статус: Участник

Создано: 13 июля 2018 13:34 New!
Цитата · Личное сообщение · #6

MikDay пишет:
push ax
pop ax

если гнаться за размером, на eax надо бы махнуть, два префикса ж лишних получаются




Ранг: 276.5 (наставник)
Статус: Участник

Создано: 13 июля 2018 13:40 New!
Цитата · Личное сообщение · #7

dosprog пишет:
Это BIOS 30-летней давности машины

Я о практическом, а не гипотетическом применении.



Ранг: 2.0 (гость)
Статус: Участник

Создано: 17 июля 2018 14:08 · Поправил: MikDay New!
Цитата · Личное сообщение · #8

f13nd
если гнаться за размером, на eax надо бы махнуть, два префикса ж лишних получаются

Приведенная подпрограмма была написана в DOS эпоху. Сегодня, Вы правы, EAX, будет лучше. Но под Windows есть готовая wsprintf. Применение "самодельного" кода оправданно только в случаях, когда "сильно жмет" - иногда бывает для встроенных приложений в системах управления.
Кстати, приведенный код легко расширяется до Word2Hex/DWord2Hex.




Ранг: 276.5 (наставник)
Статус: Участник

Создано: 17 июля 2018 14:10 · Поправил: f13nd New!
Цитата · Личное сообщение · #9

MikDay пишет:
оправданно только в случаях, когда "сильно жмет"

Я это на протяжении 4 страниц пытаюсь доказать, но есть гурманы. Сам такое пользую только когда значения регистров общего назначения жалко, wsprintf их сожрет, а pushad некошерен.



Ранг: 437.9 (мудрец)
Статус: Участник

Создано: 17 июля 2018 21:16 · Поправил: dosprog New!
Цитата · Личное сообщение · #10

f13nd пишет:
значения регистров общего назначения жалко, wsprintf их сожрет, а pushad некошерен.

) Там, где рассматривается возможность использования wsprintf(), - там pushad это пыль.






Ранг: 276.5 (наставник)
Статус: Участник

Создано: 17 июля 2018 21:23 · Поправил: f13nd New!
Цитата · Личное сообщение · #11

dosprog пишет:
) Там, где рассматривается возможность использования wsprintf(), - там pushad это пыль.

Это просто пунктик у меня такой. В прологе/эпилоге функции эти инструкции хороши, если в ней ebx/esi/edi используются, результат можно напрямую в стек воткнуть и popad его в eax поместит. А просто так их совать куда ни попадя некрасиво. Я уже устал доказывать, что программы тупят не потому, что не вылизаны идеально с точки зрения каких-то там оптимизаций.




Ранг: 322.7 (мудрец)
Статус: Участник

Создано: 17 июля 2018 21:55 · Поправил: difexacaw New!
Цитата · Личное сообщение · #12

f13nd

> wsprintf их сожрет, а pushad некошерен.

Ты что сдурел, функция вывода текста ядерная, очень толстая. Причём там какая то инструкция. Какой то бред.




Ранг: 276.5 (наставник)
Статус: Участник

Создано: 17 июля 2018 22:04 New!
Цитата · Личное сообщение · #13

difexacaw пишет:
ы что сдурел, функция вывода текста ядерная, очень толстая. Причём там какая то инструкция. Какой то бред.

Если бы я писал нотпад, которому было бы неплохо уметь перерабатывать текстовые файлы по несколько гигабайт, я бы вообще без апи все обрабатывал по-спортивному. Если задача вывести вшивую строчку в окне, вообще пофигу как это делать, хоть lua подключить и в нем строки форматировать, а потом забирать - ни на чем вообще не скажется.



Ранг: -0.7 (гость)
Статус: Участник

Создано: 17 июля 2018 22:44 New!
Цитата · Личное сообщение · #14

экономия на спичках актуальна только для очень узкого круга задач, когда нужно втиснуться в рамки серьезных ограничений по размеру или памяти, в остальных случаях достаточно выхлопа качественного компилятора.
взять photoshop, неважно 1 в нем лишний регистр или 100500, в таком софте скорость определяется уже на уровне алгоритмов, насколько они быстрые и как правильно подобраны под задачу, если заниматься байтодрочеством, ничего кроме 100500 по счету notepad не напишите, а ms word со студией все таки удобней для своих задач, хоть их и можно делать в супер быстром блокноте.




Ранг: 276.5 (наставник)
Статус: Участник

Создано: 17 июля 2018 22:52 · Поправил: f13nd New!
Цитата · Личное сообщение · #15

shellstorm пишет:
экономия на спичках актуальна только для очень узкого круга задач

Даже скорее не так. Это ужасно, но ничьи программные шедевры ни в эрмитаже, ни в лувре никогда выставлять не будут, рядом с моно-лизой. Так что если нажатие одной кнопочки она будет обрабатывать на 1/1000 секунды быстрей, этого никто не оценит.

shellstorm пишет:
ms word со студией все таки удобней для своих задач, хоть их и можно делать в супер быстром блокноте.

Ты видимо гигабайтные парсы не разбирал, без уберблокнота байтодрочерского там никак Ворд вообще с блокнотами сравнивать некорректно, он про бумажные документы с картинками.



Ранг: -0.7 (гость)
Статус: Участник

Создано: 17 июля 2018 23:07 · Поправил: shellstorm New!
Цитата · Личное сообщение · #16

f13nd пишет: этого никто не оценит

просто потому что оценивать будет нечего, такие оптимизаторы как правило ничего не пишут сами или если пишут то не заканчивают проект.

f13nd пишет: Ты видимо гигабайтные парсы не разбирал, без уберблокнота байтодрочерского там никак

парсил xml на 10GB мне хватило обычного python'a, на хабре была статья, там парсился xml на 100GB, хватило powershell'a. в этой задаче байтодрочерство не особо нужно, здесь главное правильная работа с файлом, остальное вторично. это алгоритмическая задача, которая не решается за счет вылизывания кода. сколько не вылизывай код, а прямая загрузка файла в оперативную память поставит крест на всей оптимизации.
почему некорректно, кто-то запрещает делать форматирование вручную?




Ранг: 276.5 (наставник)
Статус: Участник

Создано: 17 июля 2018 23:38 New!
Цитата · Личное сообщение · #17

shellstorm пишет:
мне хватило обычного python'a

А можно было несколько кнопок нажать, без питона. Некорректно потому что этих кнопок в ворде нету, он тупо не предназначен для обработки данных, это текстовый фотошоп.



Ранг: -0.7 (гость)
Статус: Участник

Создано: 18 июля 2018 02:56 New!
Цитата · Личное сообщение · #18

f13nd пишет: А можно было несколько кнопок нажать, без питона

при желании и там можно нажать эти же кнопки, не вижу разницы. под рукой не оказалось подходящего софта, мне проще было набросать небольшой, одноразовый скрипт, чем искать подходящий софт.

f13nd пишет: Некорректно потому что этих кнопок в ворде нету

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

f13nd пишет: он тупо не предназначен для обработки данных

именно и предназначен для обработки текстовых данных, но не рассчитан на работу с большими данными, блокнот насколько я помню с таким же типом данных работает. тем более в word давно xml в архиве, xml можно править в блокноте который идет из коробки.




Ранг: 276.5 (наставник)
Статус: Участник

Создано: 18 июля 2018 03:03 · Поправил: f13nd New!
Цитата · Личное сообщение · #19

shellstorm пишет:
именно и предназначен для обработки текстовых данных, но не рассчитан на работу с большими данными

Ворд раскидает сплошняковый xml по тегу на строку, отметит нужные по регулярному выражению, потом другие по другому регулярному выражению и вытащит отмеченные в новый файл, а потом почистит дубли и отсортирует? Заменит по маске нужную конструкцию на ";", растащит по столбикам и даст нужный скопировать в другой файл?



Ранг: -0.7 (гость)
Статус: Участник

Создано: 18 июля 2018 03:56 New!
Цитата · Личное сообщение · #20

f13nd пишет: растащит по столбикам и даст нужный скопировать в другой файл

вообще то да, у него давно есть регулярки и скриптинг, а у блокнота нет даже подсветки xml, но можно проделать тоже самое, только это удаление гланд через задний проход.
мне интересно другое, чем поможет байтодрочерство с большими файлами, учитывая что IO HD является узким местом.




Ранг: 276.5 (наставник)
Статус: Участник

Создано: 18 июля 2018 04:08 · Поправил: f13nd New!
Цитата · Личное сообщение · #21

shellstorm пишет:
а у блокнота нет даже подсветки xml

Я имел в виду блокнотЫ как класс, редакторы голого текста, они разительно отличаются от ворда.

shellstorm пишет:
IO HD является узким местом

Оперативки обычно много, если дать 64битному приложению ее побольше съесть, оно твои 10 гигов в два приёма переварит.



Ранг: 174.4 (ветеран)
Статус: Участник

Создано: 30 июля 2018 01:07 New!
Цитата · Личное сообщение · #22

У меня обратный вопрос, какой быстрый код есть для перевода строки указателя (хекс) в int64 (под х64)?




Ранг: 276.5 (наставник)
Статус: Участник

Создано: 30 июля 2018 01:40 · Поправил: f13nd New!
Цитата · Личное сообщение · #23

VOLKOFF пишет:
для перевода строки указателя (хекс) в int64

Code:
  1.                         xor rcx,rcx
  2.                         xor rdx,rdx
  3.                         .next:
  4.                         mov rax,QWORD[szTest + rcx]
  5.                         mov r8,8
  6.                         @@:
  7.                         test al,al
  8.                         .if ~ZERO?
  9.                               sub al,'0'
  10.                               .if al > 9
  11.                                    sub al,'A'-'0'-10
  12.                                    .if al > 15
  13.                                        sub al,'a'-'A'
  14.                                    .endif
  15.                               .endif
  16.                               shl rdx,4
  17.                               or dl,al
  18.                               shr rax,8
  19.                               dec r8
  20.                               jne @B
  21.                               add ecx,8
  22.                               jmp .next
  23.                         .endif
  24. ...
  25. szTest db 'aaBcD8396d31112f',0




Ранг: 437.9 (мудрец)
Статус: Участник

Создано: 30 июля 2018 04:14 · Поправил: dosprog New!
Цитата · Личное сообщение · #24

VOLKOFF пишет:
У меня обратный вопрос, какой быстрый код есть для перевода строки указателя (хекс) в int64 (под х64)?


Адаптируй процедуру х32:

Code:
  1. hesi2eax proc
  2.      ;---------------------------------
  3.      ; Hex str [ESI] -> BIN EAX
  4.      ; Change: ESI
  5.      ;---------------------------------
  6.      push    ebx  
  7.      push    ecx
  8.      push    edx
  9.      xor     eax,eax
  10.      xor     edx,edx
  11.      xor     ebx,ebx
  12.      mov     ecx,10h
  13. @@hesi2eax_next_char:
  14.      mov     bl,[esi]
  15.      sub     bl,'0'
  16.      jc      @@hesi2eax_ret
  17.      cmp     bl,9
  18.      jbe     @@hesi2eax_mul
  19.      sub     bl ,7
  20.      jc      @@hesi2eax_ret
  21.      cmp     bl ,0Fh
  22.      jbe     @@hesi2eax_mul
  23.      sub     bl, ' '
  24.      jc      @@hesi2eax_ret
  25.      cmp     bl ,0Fh
  26.      jbe     @@hesi2eax_mul
  27.      jmp     @@hesi2eax_ret
  28. @@hesi2eax_mul:
  29.       mul     ecx
  30.       add     eax,ebx
  31.       inc     esi
  32.       jmp     @@hesi2eax_next_char
  33. @@hesi2eax_ret:
  34.       pop     edx
  35.       pop     ecx
  36.       pop     ebx 
  37.       ret
  38. hesi2eax endp


Usage:

Code:
  1. .data
  2.  hex_string db  '0001234aBcDh ',0
  3. .code
  4.  lea esi, hex_string
  5.  call hesi2eax





Ранг: 276.5 (наставник)
Статус: Участник

Создано: 30 июля 2018 04:18 New!
Цитата · Личное сообщение · #25

dosprog пишет:
mul     ecx

А как же... скорость... прокрутки?..



Ранг: 437.9 (мудрец)
Статус: Участник

Создано: 30 июля 2018 04:22 · Поправил: dosprog New!
Цитата · Личное сообщение · #26

Ну, оптимизируй.

Code:
  1.  SHL EAX,4


Изначально аргументом MUL был RADIX.
В незапамятные 16-битные времена





Ранг: 174.4 (ветеран)
Статус: Участник

Создано: 30 июля 2018 04:23 · Поправил: VOLKOFF New!
Цитата · Личное сообщение · #27

Ммм... Вот рабочий вариант для понимания

Code:
  1. mov rax, [lpStr]
  2. xor rcx, rcx
  3. xor rbx, rbx
  4. mov bl, byte[rax]
  5. cmp bl, 0
  6. je ._3
  7. @@:
  8. cmp bl, 0x30            ; 0...9
  9. jb  ._1
  10. cmp bl, 0x39
  11. ja  ._1
  12. sub bl, 0x30
  13. jmp ._2
  14. ._1:   
  15. cmp bl, 0x41             ; a...f
  16. jb  ._4
  17. cmp bl, 0x46
  18. ja  ._4
  19. sub bl, 0x37
  20. jmp ._2
  21. ._4:   
  22. cmp bl, 0x61             ; a...f
  23. jb  ._3
  24. cmp bl, 0x66
  25. ja  ._3
  26. sub bl, 0x57
  27. jmp ._2
  28. ._3:
  29. mov rax, 0xFFFFFFFFFFFFFFFF
  30. ret
  31. ._2:   
  32. or  rcx, rbx
  33. inc rax
  34. mov bl, byte[rax]
  35. cmp bl, 0
  36. je .eproc
  37. shl rcx, 4
  38. jmp @b
  39. .eproc: 
  40. mov rax, rcx
  41. ret
  42.  
  43. ; lpStr '0000009B386E0AAA' rax = 666666666666
  44. ; lpStr '386E0AAA' rax = 946735786
  45. ; lpStr '6E0AAA' rax = 7211690
  46. ; lpStr '0A' rax = 10


Оптимизация и критика рукожопости приветствуется

Фига вы тут понаписали за минуту, пока я постил




Ранг: 276.5 (наставник)
Статус: Участник

Создано: 30 июля 2018 04:31 New!
Цитата · Личное сообщение · #28

VOLKOFF пишет:
cmp bl, $30            ; 0...9
jb  ._1

Меньше 30 там ничего быть не должно, можно сразу в .3 завернуть. Ну если аптимизировать, то еще
VOLKOFF пишет:
cmp bl, 0

на
Code:
  1. test bl,bl

VOLKOFF пишет:
mov rax, 0xFFFFFFFFFFFFFFFF

на
Code:
  1. xor rax,rax
  2. dec rax




Ранг: 174.4 (ветеран)
Статус: Участник

Создано: 30 июля 2018 05:06 · Поправил: VOLKOFF New!
Цитата · Личное сообщение · #29

f13nd пишет:
Меньше 30 там ничего быть не должно

В идеальном мире да, ты был бы прав.

f13nd пишет:
test bl,bl

Целый процессорный такт!
Но - ок, нано-оптимизация нужна.

f13nd пишет:
xor rax,rax
dec rax

Вот это по делу.
От меня анонимный лайк




Ранг: 276.5 (наставник)
Статус: Участник

Создано: 30 июля 2018 05:08 · Поправил: f13nd New!
Цитата · Личное сообщение · #30

VOLKOFF пишет:
Целый процессорный такт!

Это минус один байт как бы
VOLKOFF пишет:
В идеальном мире да, ты был бы прав.

В неидеальном мире число меньше 30 по всем проверкам прокатится и туда же попадет. Но неоптимальным образом.



Ранг: 174.4 (ветеран)
Статус: Участник

Создано: 30 июля 2018 05:12 New!
Цитата · Личное сообщение · #31

Пардоньте, с 'al' попутал, тогда бы они обе двухбайтовые были и разница в один такт.


<< . 1 . 2 . 3 . 4 . 5 . >>
 eXeL@B —› Программирование —› ByteToHex

Видеокурс ВЗЛОМ