purebasic.info
http://purebasic.info/phpBB3ex/

Hex2Dec
http://purebasic.info/phpBB3ex/viewtopic.php?f=19&t=4801
Страница 1 из 2

Автор:  Volkoff [ Сб дек 02, 2017 8:19 pm ]
Заголовок сообщения:  Hex2Dec

Тут нигде не завалялся адекватный аналог на фасме:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
Procedure Hex2Dec(ValAddr.l, BytesLen.l)
 
  ProcedureReturn Val("$"+PeekS(ValAddr, BytesLen))
 
EndProcedure
 
Val1.s = "007714A3"
Val2.s = "03"
 
Debug RSet(Hex(Hex2Dec(@Val1, 8),#PB_Long),8,"0")
Debug RSet(Hex(Hex2Dec(@Val2, 2),#PB_Byte),2,"0")
 



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

Автор:  repeat [ Сб дек 02, 2017 9:29 pm ]
Заголовок сообщения:  Re: Hex2Dec

Что-то очень сложно, может так пойдет? :shock:
Код:
1
2
3
4
5
6
7
8
9
10
Val2.s = "03"
Val1.s = "007714A3"
 
Procedure Hex2Dec(ValAddr.s)
  ProcedureReturn Val("$" + ValAddr)
EndProcedure
 
 
Debug Hex2Dec(Val1)
Debug Hex2Dec(Val2)


Автор:  kvitaliy [ Сб дек 02, 2017 9:32 pm ]
Заголовок сообщения:  Re: Hex2Dec

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
; German forum: http://www.purebasicforums.com/german/viewtopic.php?t=384&postdays=0&postorder=asc&start=10
; Author: PureFan
; Date: 01. April 2005
; OS: Windows
; Demo: Yes
 
; Convert hexa-decimal numbers into decimal numbers
; It works only with 8 characters long hex strings, but is very fast for them!
 
; Hexadezimal-Zahlen in Dezimalzahlen umwandeln
; Assembler-Variante, die allerdings nur bei genau 8 Zeichen langen Hex-Strings funktioniert.
; Da sie ohne Jumps und String-Befehle auskommt ist sie jedoch um einiges schneller!
 
Procedure PureFans_Hex2Dec(Value)
  !POP Edi
  !PUSH Edi
  !MOV Ebx,[Edi]
  !SUB Ebx,030303030h
  !MOV Eax,Ebx
  !SHR Eax,4
  !AND Eax,01010101h
  !MOV Edx,7
  !MUL Edx
  !SUB Ebx,Eax
  !AND Ebx,0F0F0F0Fh
  !SHL bl,4
  !OR bl,bh
  !ROR Ebx,16
  !SHL bl,4
  !OR bh,bl
  !SHL Ebx,8
  !XOR bx,bx
  !MOV Ecx,[Edi+4]
  !SUB Ecx,030303030h
  !MOV Eax,Ecx
  !SHR Eax,4
  !AND Eax,01010101h
  !MOV Edx,7
  !MUL Edx
  !SUB Ecx,Eax
  !AND Ecx,0F0F0F0Fh
  !SHL cl,4
  !OR cl,ch
  !ROR Ecx,16
  !SHL cl,4
  !OR ch,cl
  !SHL Ecx,8
  !XOR cx,cx
  !SHR Ecx,16
  !OR Ecx,Ebx
  !MOV Eax,Ecx
  ProcedureReturn
EndProcedure
 
Debug Hex(PureFans_Hex2Dec(@"abcdef01"))
Debug Hex(PureFans_Hex2Dec(@"ABCDEF01"))
Debug Hex(PureFans_Hex2Dec(@"01234567"))
 
 


Автор:  Volkoff [ Сб дек 02, 2017 9:55 pm ]
Заголовок сообщения:  Re: Hex2Dec

repeat писал(а):
может так пойдет?
не fasm

kvitaliy
Код:
1
Debug Hex(PureFans_Hex2Dec(@"007714A3")) 

выдает 169F90BB вместо ожидаемого 7714A3

Автор:  kvitaliy [ Вс дек 03, 2017 6:21 am ]
Заголовок сообщения:  Re: Hex2Dec

Volkoff писал(а):
repeat писал(а):
может так пойдет?
не fasm

kvitaliy
Код:
1
Debug Hex(PureFans_Hex2Dec(@"007714A3")) 

выдает 169F90BB вместо ожидаемого 7714A3

Не знаю, не проверял, наверно со времён PB v 4.xx что то изменилось. Вообще не вижу смысла использовать такую портянку, если можно гораздо короче: Val("$" + Hex$)
Обычно такие преобразования имеют чисто визуальный эффект, для отображения, и зачем их делать очень быстро?

Автор:  Сергейчик [ Вс дек 03, 2017 9:38 am ]
Заголовок сообщения:  Re: Hex2Dec

Volkoff писал(а):
Тут нигде не завалялся адекватный аналог на фасме:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
Procedure Hex2Dec(ValAddr.l, BytesLen.l)
 
  ProcedureReturn Val("$"+PeekS(ValAddr, BytesLen))
 
EndProcedure
 
Val1.s = "007714A3"
Val2.s = "03"
 
Debug RSet(Hex(Hex2Dec(@Val1, 8),#PB_Long),8,"0")
Debug RSet(Hex(Hex2Dec(@Val2, 2),#PB_Byte),2,"0")
 



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

Раз шифруй задачку(что,куда от куда)
PS:Что то подобное писсал.

Автор:  Volkoff [ Вс дек 03, 2017 12:23 pm ]
Заголовок сообщения:  Re: Hex2Dec

kvitaliy писал(а):
зачем их делать очень быстро?
Потому что нужно для частного случая в промышленных масштабах. Вот так все банально.

Автор:  kvitaliy [ Вс дек 03, 2017 1:09 pm ]
Заголовок сообщения:  Re: Hex2Dec

Volkoff писал(а):
Потому что нужно для частного случая в промышленных масштабах. Вот так все банально.

Мой мозг просто не может смоделировать ситуацию, когда это действительно нужно быстро. Ведь все в курсе, что компы считают не в десятичной системе и даже не в HEX, а в двоичной?
Кинь простой пример, где нужно в промышленном масштабе быстро, на ASMe преобразовать Hex2Dec, а то я от любопытства помру, заодно и Сергейчик сможет тебе с АСМом помочь, он в нём большой дока.

Автор:  Volkoff [ Вс дек 03, 2017 2:07 pm ]
Заголовок сообщения:  Re: Hex2Dec

Как тут все сложно...

Вот готовое решение, пользуйтесь, если и у вас когда-нибудь ситуация смоделируется :)

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Procedure hex2dec(lpStr.l)
  !xor     eax,eax
  !mov     esi,[p.v_lpStr]
  !hex2dec_loop:
 !movsx   ebx,byte [esi]
  !Or      bl,20h
  !cmp     bl,'0'
  !jb      hex2dec_ret
  !cmp     bl,'9'
  !ja      hex2dec_1
  !sub     bl,'0'
  !jmp     hex2dec_calc
  !hex2dec_1:
 !cmp     bl,'a'
  !jb      hex2dec_ret
  !cmp     bl,'f'
  !ja      hex2dec_ret
  !sub     bl,('a'-10)
  !hex2dec_calc:
 !imul    eax,16
  !add     eax,ebx
  !inc    esi
  !jmp     hex2dec_loop
  !hex2dec_ret:
 ProcedureReturn ; 0 if fail
EndProcedure
 
Debug Hex(hex2dec(@"004029EF"))
Debug Hex(hex2dec(@"EF"))


Автор:  kvitaliy [ Вс дек 03, 2017 2:24 pm ]
Заголовок сообщения:  Re: Hex2Dec

Volkoff писал(а):
если и у вас когда-нибудь ситуация смоделируется :)

Это вряд ли. Почти уверен, что такой надобности не существует в природе :D
Тем более что код не рабочий для PB v 5.60 и новее.

Автор:  Пётр [ Вс дек 03, 2017 2:27 pm ]
Заголовок сообщения:  Re: Hex2Dec

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
DisableDebugger
 
Procedure hex2dec(lpStr.l)
  !xor     eax,eax
  !mov     esi,[p.v_lpStr]
  !hex2dec_loop:
 !movsx   ebx,byte [esi]
  !Or      bl,20h
  !cmp     bl,'0'
  !jb      hex2dec_ret
  !cmp     bl,'9'
  !ja      hex2dec_1
  !sub     bl,'0'
  !jmp     hex2dec_calc
  !hex2dec_1:
 !cmp     bl,'a'
  !jb      hex2dec_ret
  !cmp     bl,'f'
  !ja      hex2dec_ret
  !sub     bl,('a'-10)
  !hex2dec_calc:
 !imul    eax,16
  !add     eax,ebx
  !inc    esi
  !jmp     hex2dec_loop
  !hex2dec_ret:
 ProcedureReturn ; 0 if fail
EndProcedure
 
#Count = 10000000
 
t1 = ElapsedMilliseconds()
 
For i=1 To #Count
  x=hex2dec(@"004029EF")
Next
 
t2 = ElapsedMilliseconds()
 
For i=1 To #Count
  x=Val("$004029EF")
Next
 
t3 = ElapsedMilliseconds()
 
MessageRequester("", "hex2dec "+ Str(t2-t1)+" ms"+#CRLF$+
                     "Val "+Str(t3-t2)+" ms")

При 10 миллионах преобразований, время одинаково. Оно того стоит, учитывая что hex2dec не поддерживает юникод и x64?

Автор:  Volkoff [ Вс дек 03, 2017 3:14 pm ]
Заголовок сообщения:  Re: Hex2Dec

Volkoff писал(а):
нужно для частного случая
Конкретно текущая задача требовала сделать именно так (+ там ASCII х32).
Да оно того стоило. И асм вариант на объемах действительно быстрее.
Иногда бывает реально нужно что-то под специфические нужды из разряда "нет времени объяснять" и хочется придти к друзьям за помощью, а тут тебя палочкой тыкают, объясняя что ну его нафег, юзай сток и сиди ровно... Ну зачем так, давайте добрее будем друг к другу ;)

Автор:  kvitaliy [ Вс дек 03, 2017 5:42 pm ]
Заголовок сообщения:  Re: Hex2Dec

При чем тут добрее или злее друг к другу? Реально было интересно узнать, где это можно применить с пользой, чисто профессионально. А тут отмазка из разряда "нет времени объяснять", хотя хочется придти к друзьям за помощью?
Нет, с друзьями так не поступают :|

Автор:  SereZa [ Вс дек 03, 2017 6:16 pm ]
Заголовок сообщения:  Re: Hex2Dec

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

Автор:  Volkoff [ Вс дек 03, 2017 7:38 pm ]
Заголовок сообщения:  Re: Hex2Dec

kvitaliy писал(а):
где это можно применить

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

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/