我有这样的价值
DECLARE @hex VARCHAR(64) = '00E0'
我需要将此值转换为double。
我有C语言的代码
double conver_str_to_temp(char *strTemp)
{
int iTemp;
double fTemp;
iTemp = strtoul(strTemp, 0, 16); //strTemp is the string get from the message.
if (iTemp & 0x8000) //This means this is a negative value
{
iTemp -= 0x10000;
}
fTemp = iTemp * 0.0625;
return fTemp;
}
结果:'00E0'
为14.000000
结果:'FF6B'
为-9.312500
但问题是我在T-SQL方面不太好。
如何将此C代码转换为用于SQL Server的T-SQL函数?
答案 0 :(得分:3)
没有将包含十六进制值的字符串直接转换为数字的功能。但是你可以使用varbinary
的中间转换,然后可以很容易地转换为整数。
但是,转换为varbinary
时,您需要指定正确的格式,以便将字符串解释为十六进制值(而不是任意数字和字母的字符串)。此
CONVERT(varbinary, '00E0')
实际上默认为CONVERT(varbinary, '00E0', 0)
,将导致每个字符单独转换,因为这就是0
格式说明符所做的。因此,每个'0'
都会转换为0x30
和'E'
转换为0x45
,这最终会为您提供0x30304530
- 很可能不是您想要的结果。< / p>
相比之下,这个
CONVERT(varbinary, '00E0', 2)
结果为0x00E0
,因为2
格式说明符告诉函数将字符串解释为(非前缀的)十六进制值。
现在您已经获得了字符串的正确varbinary
表示,您可以使用任一方法suggested by @armen将值转换为整数:像这样
CONVERT(varbinary, '00E0', 2) * 1
或者像这样:
CONVERT(int, CONVERT(varbinary, '00E0', 2))
为了解释前一种方法,它使用隐式转换:因为乘法的另一个操作数1
是int
而int
的优先级高于varbinary
}},varbinary
操作数隐式转换为int
(在此特定情况下为224
),然后才能进行乘法运算。
您可以详细了解转化in the manual。
答案 1 :(得分:2)
试试这个 - :
DECLARE @hex VARCHAR(64) = '00E0'
SELECT CONVERT(VARBINARY, @hex) * 1
-- OR
SELECT CONVERT(INT, CONVERT(VARBINARY, @hex))
答案 2 :(得分:0)
在您的情况下,您可以执行以下操作
declare @hex float
set @hex = 00E0
select @hex