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 中一起测试所有这些。
我在将十六进制字符串转换为浮点数时遇到了一些挑战。
这是一个例子:
十六进制:
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 中一起测试所有这些。