【问题标题】:MySql function: Hexadecimal conversation to FloatMySql 函数:十六进制转换为浮点数
【发布时间】:2021-08-11 15:58:58
【问题描述】:

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

这是一个例子:

十六进制: 3F62 0C3C

二进制:00111111011000100000110000111100

转换结果(float big endian): 0.8829992

这种转换可以用MySql函数实现吗?如果可以的话,如何实现?

感谢您的帮助。

【问题讨论】:

    标签: mysql sql floating-point type-conversion hex


    【解决方案1】:

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

    SELECT @hexstring := '3F62 0C3C'
    

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

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

    从十进制表示中,您可以计算您的浮点数(基于this SO answer):

    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 中一起测试所有这些。

    【讨论】:

    • @rhh 不客气。但是,没有必要使用 cmets 表示感谢。随意接受(就像你已经做过的那样)和upvote answers you find useful 表达你的感谢。干杯!
    猜你喜欢
    • 2014-03-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2020-07-28
    相关资源
    最近更新 更多