Что нового

Как заставить функцию HEX работать с переменной?

Gorizont

Новичок
Сообщения
9
Репутация
0
Приветствую Всех.
Начал изучать Autolt и при пробном написании нужного мне скрипта столкнулся с проблемой.
Необходимо получить Hex значение переменной, а данная функция хочет работать только с конкретным числом или с текстом.
Подскажите пожалуйста как можно получить Hex значение от вычисляемого числа?
Так-же необходимо поменять старший и младший байты местами в полученном Hex значении, но думаю как нибудь справлюсь с этим.
Спасибо.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
А пример привести Вы можете?

Код:
$v = 100 / 2 + 350 * 3
ConsoleWrite(Hex($v))
 
Автор
G

Gorizont

Новичок
Сообщения
9
Репутация
0
Вот что пока смог написать:
Если вместо переменной указываю само значение переменной то все верно ,
Код:
#include <math.au3>
$I_Var = InputBox('PWM_Voltag_Editor', 'Enter a voltag:')
$I_Result = $I_Var*4095/18
MsgBox(1,"Dec", $I_Result)
$I_Var2 = $I_Result

$result = Hex($I_Var2)

MsgBox(1, "Hex", $result)
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Администратор.






Добавлено:
Сообщение автоматически объединено:

Вы запутались... Переменной может быть и текст и цифра и шестнадцетиричное число
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Gorizont,
Код:
$sNum = Random(1, 9, 1)
For $i = 1 To 6
	$sNum &= Random(0, 9, 1)
Next
$sNum &= Random(1, 9, 1)
ConsoleWrite('String: ' & $sNum & @LF)
ConsoleWrite('IsString: ' & IsString($sNum) & @LF)
ConsoleWrite('Hex: ' & Hex($sNum) & @LF)
ConsoleWrite('Dec: ' & Dec(Hex($sNum)) & @LF)
ConsoleWrite('----' & @LF)
$iNum = 0xCFFD
ConsoleWrite('Dec: ' & $iNum & @LF)
ConsoleWrite('Hex: ' & Hex($iNum) & @LF)
ConsoleWrite('Dec: ' & Dec(Hex($iNum)) & @LF)
ConsoleWrite('----' & @LF)
$sString = '123dfrgke84y5t77'
ConsoleWrite('String: ' & $sString & @LF)
$sString = StringRegExpReplace($sString, '[^\d]', '')
ConsoleWrite('String num: ' & $sString & @LF)
ConsoleWrite('Hex: ' & Hex($sString) & @LF)
ConsoleWrite('Dec: ' & Dec(Hex($sString)) & @LF)
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Странно, но на версии 3.3.8.0 дают разный результат эти примеры
Код:
$v = 100 / 2 + 350 * 3
; $v = 1100
; MsgBox(0, 'Сообщение', $v)
MsgBox(0, 'Сообщение', Hex($v))


Код:
; $v = 100 / 2 + 350 * 3
$v = 1100
; MsgBox(0, 'Сообщение', $v)
MsgBox(0, 'Сообщение', Hex($v))
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
3.3.6.1 - все отлично. Мне кажется на 3.3.8.0 сломали функцию HEX

потому что это не первая проблема...
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
madmasles
Да я уже догадался проверить VarGetType($v), но решения то нет.
Добавил Int и заработало.
Код:
$v = 100 / 2 + 350 * 3
MsgBox(0, 'Сообщение', Hex(Int($v)))


да, увидел, что там тоже есть int ...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
AZJIO,
В 3.3.8.0 так работает.
Код:
$i = 10
$iInt32 = $i * $i
$iDouble = $i ^ 2
$iDouble_1 = 1000 / 10
ConsoleWrite($iInt32 & @TAB & VarGetType($iInt32) & @LF)
ConsoleWrite($iDouble & @TAB & VarGetType($iDouble) & @LF)
ConsoleWrite($iDouble_1 & @TAB & VarGetType($iDouble_1) & @LF)

ConsoleWrite(Hex($iInt32) & @LF)
ConsoleWrite(Hex(Int($iDouble)) & @LF)
ConsoleWrite(Hex(Int($iDouble_1)) & @LF)
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
madmasles
Наша задача найти оптимальный вариант. Что быстрее сработает проверить с помощью VarGetType а потом выполнить по условию или сразу применить int.

Сразу int работает в 2 раза быстрее

Код:
$timer = TimerInit()
$iDouble = 5 ^ 2
For $i = 1 to 100000
	If VarGetType($iDouble) Then
		$txt=Hex(Int($iDouble))
	Else
		$txt=Hex($iDouble)
	EndIf
Next
MsgBox(0,"Время выполнения", 'Время : '&Round(TimerDiff($timer) / 1000, 2) & ' сек')

$timer = TimerInit()
$iDouble = 5 ^ 2
For $i = 1 to 100000
	$txt=Hex(Int($iDouble))
Next
MsgBox(0,"Время выполнения", 'Время : '&Round(TimerDiff($timer) / 1000, 2) & ' сек')
 
Автор
G

Gorizont

Новичок
Сообщения
9
Репутация
0
Спасибо, с Int все работает, но не обрезает до 4 последних знаков почему-то.

Код:
#include <math.au3>
$I_Var = InputBox('PWM_Voltag_Editor', 'Enter a voltag:')
$I_Result = $I_Var*4095/18
MsgBox(1,"Dec", $I_Result)
$I_Var2 = $I_Result
$result = Hex(int($I_Result, 4))
MsgBox(1, "Hex", $result)
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Gorizont
Просто ошибочку надо поправить...
Код:
$result = Hex(int($I_Result), 4)
 
Автор
G

Gorizont

Новичок
Сообщения
9
Репутация
0
Спасибо, не заметил, голова уже пухнет от обилия информации)))
Может подскажете еще, не могу найти функцию типа Byte Flip , для смена местами старших и младших байтов.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Gorizont
Обычно один вопрос - одна тема. BitRotate - делает сдвиг, возможно просто нужно открыть файл в нужной кодировке FileOpen (UTF16 Little Endian или UTF16 Big Endian)
 
Верх