首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql函数:浮点型的十六进制会话

问MySql函数:浮点型的十六进制会话
EN

Stack Overflow用户
提问于 2021-05-23 03:45:24
回答 1查看 49关注 0票数 1

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

下面是一个示例:

十六进制:3F62 0C3C

二进制:00111111011000100000110000111100

转换结果(浮点型高字节顺序):0.8829992

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

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-23 06:43:50

因此,我假设您的十六进制字符串是某种TEXT类型:

代码语言:javascript
复制
SELECT @hexstring := '3F62 0C3C'

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

代码语言:javascript
复制
SELECT @binvalue := CONV(REPLACE(@hexstring, ' ', ''), 16, 2)   -- 111111011000100000110000111100
SELECT @decvalue := CONV(REPLACE(@hexstring, ' ', ''), 16, 10)  -- 1063390268

根据小数表示法,您可以计算浮点数(基于this SO answer):

代码语言:javascript
复制
SELECT SIGN(@decvalue) *  (1.0 + (@decvalue &  0x007FFFFF) * POWER(2.0, -23))
  * POWER(2.0, (@decvalue & 0x7f800000) / 0x00800000 - 127)

结果:

代码语言:javascript
复制
0.8829991817474365

或者全部放在一起:

代码语言:javascript
复制
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中一起测试所有这些功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67653555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档