将Hex转换为SQL中的无符号长整数

时间:2013-06-28 07:09:11

标签: sql sql-server tsql

我有这样的价值

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函数?

3 个答案:

答案 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))

为了解释前一种方法,它使用隐式转换:因为乘法的另一个操作数1intint的优先级高于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)

在TSQL中,你不需要使用转换函数, SQL Server将本质上将HEX值转换为整数。

在您的情况下,您可以执行以下操作

declare @hex float
set @hex = 00E0
select @hex