Страница 1 из 2
Конвертация HEX в Long
Добавлено: 04 Ноябрь 2021, 9:55
Игорь Столяров
Привет всем !
Есть прекрасная функция LongToHEX() для конвертации числа из 10-чной в 16-тиричную систему исчисления.
А есть ли обратная функция ?
Есть строка 'ABCD' - можно ли как-то просто получить 10-тичное значение ?
Понятно, что можно распарсить в цикле с младшего разряда ... но неужели нет готового метода ?

Заранее спасибо !
Конвертация HEX в Long
Добавлено: 04 Ноябрь 2021, 10:09
Дед Пахом
Код: Выделить всё
sHexStr STRING('ABCD')
x = EVALUATE('0' & sHexStr & 'h')
Конвертация HEX в Long
Добавлено: 04 Ноябрь 2021, 11:25
Игорь Столяров
Неожиданно. Спасибо !

Конвертация HEX в Long
Добавлено: 04 Ноябрь 2021, 11:45
Игорь Столяров
Всё работает. Теперь удалось сделать отображение версий DLL в человекочитабельном виде.
Конвертация HEX в Long
Добавлено: 04 Ноябрь 2021, 11:49
Дед Пахом
0x353Eh это сразу во всех форматах, надо либо 0x353E (c/c++), либо 0353Eh (Clarion).
Конвертация HEX в Long
Добавлено: 04 Ноябрь 2021, 11:51
Игорь Столяров
Спасибо. Сделал вариант 0x353E - думаю сисадминам он более понятен, чем Clarion'новский.

Конвертация HEX в Long
Добавлено: 04 Ноябрь 2021, 14:04
kreator
У меня тоже есть такая же конвертация. Через evaluate. Только забыл зачем этот evaluate там нужен? Старость - не радость.

Может здесь это уже обсуждали? Не мог же я сам это придумать?

Конвертация HEX в Long
Добавлено: 04 Ноябрь 2021, 14:59
gopstop2007
Игорь Столяров писал(а): 04 Ноябрь 2021, 11:45
Всё работает. Теперь удалось сделать отображение версий DLL в человекочитабельном виде.
Пока не сталкивался, но все равно интересно, как вы проверяете?
В основном app.exe или дополнительного? И если можете, поделитесь кусочком кода сего чуда

Спасибо заранее.
Конвертация HEX в Long
Добавлено: 04 Ноябрь 2021, 15:14
Игорь Столяров
gopstop2007 писал(а): 04 Ноябрь 2021, 14:59
И если можете, поделитесь кусочком кода сего чуда
Идите Вы вот сюда:
viewtopic.php?f=1&t=4844
А я там сейчас пример добавлю ...

Конвертация HEX в Long
Добавлено: 07 Ноябрь 2021, 0:36
Игорь Столяров
Забавно вышло, но нашёл ответ на свой вопрос вот здесь:
https://github.com/deesoftprog/Clarion-Hint-library
И вообще, интересный раздел мелких функций в исходниках ...

Вот это точно можно было бы в FAQ добавить.

Конвертация HEX в Long
Добавлено: 01 Август 2023, 7:07
Игорь Столяров
Нашёл интересный, и наверно оптимальный, вариант сабжа !
Код: Выделить всё
HexToLong PROCEDURE (String pHex) !,Long
RetVal Long,Auto
Code
pHex = Upper(pHex)
RetVal = InString(Sub(pHex,Len(Clip(pHex)),1),'123456789ABCDEF',1)
If Len(Clip(pHex)) > 1
RetVal += 16 * HexToLong(Sub(pHex,1,Len(Clip(pHex)) - 1))
end
Return RetVal
Конвертация HEX в Long
Добавлено: 01 Август 2023, 12:00
Дед Пахом
Ну с рекурсией так себе скорость будет. Да ещё эти Clip, Len, InString явно не убыстряют.
Конвертация HEX в Long
Добавлено: 01 Август 2023, 12:34
Игорь Столяров
Здесь рекурсия предсказуемая ... В принципе, её мона заменить на цикл Len(pHex) по строке.

Конвертация HEX в Long
Добавлено: 01 Август 2023, 12:44
Дед Пахом
Мне нравится это "В принципе"

Конвертация HEX в Long
Добавлено: 01 Август 2023, 13:14
Игорь Столяров
Здесь нет халявщиков и мониторщиков !

На вскидку без рекурсии:
Код: Выделить всё
ZINT::HexToLong Procedure(String pHex) !,Long
RetVal Long(0)
lCoef Long(1)
bCount Byte,Auto
Code
Loop bCount = Len(pHex) to 1 by -1
RetVal += InString(Upper(Sub(pHex,bCount,1)),'123456789ABCDEF',1) * lCoef
lCoef *= 16
end
Return RetVal
Быстрее кусать строку как массив, но мы за безопасный код !
