purebasic.info

PureBasic forum
Текущее время: Пт дек 15, 2017 9:20 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Hex2Dec
СообщениеДобавлено: Сб дек 02, 2017 8:19 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 799
Откуда: Нерезиновая
Благодарил (а): 21 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Тут нигде не завалялся адекватный аналог на фасме:

Код:
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, но имхо он избыточен и к тому же иногда стек ломает непредсказуемым образом, если используется в большом коде.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Hex2Dec
СообщениеДобавлено: Сб дек 02, 2017 9:29 pm 
Не в сети
док

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 191
Благодарил (а): 7 раз.
Поблагодарили: 25 раз.
Пункты репутации: 0
Что-то очень сложно, может так пойдет? :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)



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Hex2Dec
СообщениеДобавлено: Сб дек 02, 2017 9:32 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6204
Благодарил (а): 16 раз.
Поблагодарили: 171 раз.
Пункты репутации: 48
Код:
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"))
 
 


_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Hex2Dec
СообщениеДобавлено: Сб дек 02, 2017 9:55 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 799
Откуда: Нерезиновая
Благодарил (а): 21 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
repeat писал(а):
может так пойдет?
не fasm

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

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Hex2Dec
СообщениеДобавлено: Вс дек 03, 2017 6:21 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6204
Благодарил (а): 16 раз.
Поблагодарили: 171 раз.
Пункты репутации: 48
Volkoff писал(а):
repeat писал(а):
может так пойдет?
не fasm

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

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

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

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Hex2Dec
СообщениеДобавлено: Вс дек 03, 2017 9:38 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 545
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
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:Что то подобное писсал.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Hex2Dec
СообщениеДобавлено: Вс дек 03, 2017 12:23 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 799
Откуда: Нерезиновая
Благодарил (а): 21 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
kvitaliy писал(а):
зачем их делать очень быстро?
Потому что нужно для частного случая в промышленных масштабах. Вот так все банально.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Hex2Dec
СообщениеДобавлено: Вс дек 03, 2017 1:09 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6204
Благодарил (а): 16 раз.
Поблагодарили: 171 раз.
Пункты репутации: 48
Volkoff писал(а):
Потому что нужно для частного случая в промышленных масштабах. Вот так все банально.

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

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Hex2Dec
СообщениеДобавлено: Вс дек 03, 2017 2:07 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 799
Откуда: Нерезиновая
Благодарил (а): 21 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Как тут все сложно...

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

Код:
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"))



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Hex2Dec
СообщениеДобавлено: Вс дек 03, 2017 2:24 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6204
Благодарил (а): 16 раз.
Поблагодарили: 171 раз.
Пункты репутации: 48
Volkoff писал(а):
если и у вас когда-нибудь ситуация смоделируется :)

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

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Hex2Dec
СообщениеДобавлено: Вс дек 03, 2017 2:27 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11070
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
Код:
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?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Hex2Dec
СообщениеДобавлено: Вс дек 03, 2017 3:14 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 799
Откуда: Нерезиновая
Благодарил (а): 21 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Volkoff писал(а):
нужно для частного случая
Конкретно текущая задача требовала сделать именно так (+ там ASCII х32).
Да оно того стоило. И асм вариант на объемах действительно быстрее.
Иногда бывает реально нужно что-то под специфические нужды из разряда "нет времени объяснять" и хочется придти к друзьям за помощью, а тут тебя палочкой тыкают, объясняя что ну его нафег, юзай сток и сиди ровно... Ну зачем так, давайте добрее будем друг к другу ;)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Hex2Dec
СообщениеДобавлено: Вс дек 03, 2017 5:42 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6204
Благодарил (а): 16 раз.
Поблагодарили: 171 раз.
Пункты репутации: 48
При чем тут добрее или злее друг к другу? Реально было интересно узнать, где это можно применить с пользой, чисто профессионально. А тут отмазка из разряда "нет времени объяснять", хотя хочется придти к друзьям за помощью?
Нет, с друзьями так не поступают :|

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Hex2Dec
СообщениеДобавлено: Вс дек 03, 2017 6:16 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1561
Откуда: Алматы
Благодарил (а): 12 раз.
Поблагодарили: 37 раз.
Пункты репутации: 5
ну незнай... обычно когда что-то делаешь, то не выкладываешь все карты на стол - так как тебя могут опередить и сделать такое-же и лучше чем у тебя, а обычно выдаешь инфу по крупицам, чтоб общую проблему объяснить, но весь замысел не выкладываешь :) а когда с кодом помогли - прикручиваешь к своему мегапроекту и радостный идешь спать.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Hex2Dec
СообщениеДобавлено: Вс дек 03, 2017 7:38 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 799
Откуда: Нерезиновая
Благодарил (а): 21 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
kvitaliy писал(а):
где это можно применить

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


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB