Что нового

Почему функция HEX переводит не правильно.

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Не могу понять. Вот есть функция HEX - переводит в шестнадцатеричный формат.
HEX("212",2) - возвратит D4
HEX(212,2) - тоже возвратит D4 что правильно.

А вот в таком примере возвращает 406A800000000000, не пойму почему
Код:
$Bin='11010100'
Local $Result
$b = StringLen($Bin)
For $i = 1 To $b
$c = StringMid($Bin, $i, 1)
$d = $b - $i
$e = $c * (2 ^ $d)
$Result = $Result + $e
Next
ConsoleWrite($Result & @LF) ; Тут 212 Верно. 212 - строка. Переведем ее в HEX, ожидаем D4
ConsoleWrite(Hex($Result) & @LF) ; <- Что за 406A800000000000  ???
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Может так?
Код:
ConsoleWrite(Hex($Result*1) & @LF)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Без каких либо изменений запустил скрипт.
В консоли
Код:
212
000000D4
+>11:15:51 AutoIT3.exe ended.rc:0
>Exit code: 0    Time: 10.649

Что не устраивает?
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
У меня при первом запуске примера автора
тоже почему-то нечто такое выдало.
Затем его пример стал нормально работать. :scratch:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
А если поставить как положено
Код:
Local $Result = 0

?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
inververs сказал(а):
А вот в таком примере возвращает 406A800000000000, не пойму почему

Потому что у вас $Result вещественного типа, и Hex() ее обрабатывает соответственно. Это справедливо для AutoIt 3.3.8.x. Читайте внимательнее справку. Для AutoIt 3.3.6.1 и ниже Hex() работает только с целыми числами.

Используйте Round() для получения целого типа перед вызовом Hex().

Код:
$Bin = '11010100'
Local $Result
$b = StringLen($Bin)
For $i = 1 To $b
	$c = StringMid($Bin, $i, 1)
	$d = $b - $i
	$e = $c * (2 ^ $d)
	$Result = $Result + $e
Next
ConsoleWrite($Result & @LF)
ConsoleWrite(Hex(Round($Result)) & @LF)
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Понятно. Спасибо.
Я еще заметил что если перевести сперва в строку, то hex нормально переведет.
Код:
ConsoleWrite(Hex(Round($Result)) & @LF) ;00000000000000D4 версия 3.3.8.1; 000000D4 версия 3.3.9.4
ConsoleWrite(Hex(String($Result)) & @LF) ;000000D4



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

C2H5OH [?]
А если поставить как положено
Та же картина.
 
Верх