MySql 函数:十六进制转浮点数

MySql function: Hexadecimal conversation to Float

我在将十六进制字符串转换为浮点数时遇到了一些挑战。

这是一个例子:

十六进制: 3F62 0C3C

二进制:00111111011000100000110000111100

转换结果(float big endian): 0.8829992

能否使用 MySql 函数实现这种转换?如果可能,如何实现?

感谢您的帮助。

所以,我假设您有某种 TEXT 类型的十六进制字符串:

SELECT @hexstring := '3F62 0C3C'

您需要做的第一件事是将其转换为小数。您可以使用 CONV 函数执行此操作。为此,首先使用 REPLACE 函数从字符串中删除空格。根据 CONV 函数的参数,您可以例如获取二进制或十进制表示:

SELECT @binvalue := CONV(REPLACE(@hexstring, ' ', ''), 16, 2)   -- 111111011000100000110000111100
SELECT @decvalue := CONV(REPLACE(@hexstring, ' ', ''), 16, 10)  -- 1063390268

从十进制表示,你可以计算出你的浮点数(基于):

SELECT SIGN(@decvalue) *  (1.0 + (@decvalue &  0x007FFFFF) * POWER(2.0, -23))
  * POWER(2.0, (@decvalue & 0x7f800000) / 0x00800000 - 127)

结果:

0.8829991817474365

或合二为一:

SELECT SIGN(CONV(REPLACE(@hexstring, ' ', ''), 16, 10)) 
  * (1.0 + (CONV(REPLACE(@hexstring, ' ', ''), 16, 10) &  0x007FFFFF) 
  * POWER(2.0, -23)) 
  * POWER(2.0, (CONV(REPLACE(@hexstring, ' ', ''), 16, 10) & 0x7f800000) / 0x00800000 - 127)

this db<>fiddle 中一起测试所有这些。