使用TSQL解压缩二进制字符串

时间:2011-07-12 10:13:38

标签: sql-server tsql

美好的一天,

我有一些二进制字符串是由带有结构的C应用程序创建的。想象一下,如果你愿意,结构看起来像这样:

 struct {
     int foo; 
     double bar; //Assume 8 bytes
     char[20] baz;
 }

每个字符串长度为4 + 8 + 20 = 32个字节。字符串的结构如下所示:

IIIIDDDDDDDDSSSSSSSSSSSSSSSSSSSS

我需要在TSQL存储过程中解压缩此字符串。字符串很简单:

baz = SUBSTRING(binarystring, 12, 20)

int也。然后转换为具有位移的整数(好吧,乘以2 ^ 4,2 ^ 8等)

foo_string = SUBSTRING(binarystring, 0, 4)
foo = unpack_int(foo_string)

但是,双重挑战更具挑战性。我可以按照IEEE754规范来做到这一点,我对自己这样做感到不满意。

是否有一个函数或某些东西可以解包int并从二进制字符串中加倍?

谢谢,

P.S。我自己从未使用过TSQL,所以上面的碎片可能是非法的,但你得到了这个概念。我在帮助一位同事。

1 个答案:

答案 0 :(得分:2)

没有内置函数可以从二进制转换为float。但是,您可以在T-SQL中找到用户定义的函数来执行此转换,或者您可以使用BitConverter.ToDouble(byte [])方法编写clr函数来执行此转换。

可以从sqlteam的thread找到用于将二进制转换为float的t-sql函数示例:

CREATE FUNCTION [dbo].[fnBinaryFloat2Float]
(
    @BinaryFloat BINARY(8)
)
RETURNS FLOAT
AS
BEGIN
    RETURN  SIGN(CAST(@BinaryFloat AS BIGINT))
        * (1.0 + (CAST(@BinaryFloat AS BIGINT) & 0x000FFFFFFFFFFFFF) * POWER(CAST(2 AS FLOAT), -52))
        * POWER(CAST(2 AS FLOAT), (CAST(@BinaryFloat AS BIGINT) & 0x7ff0000000000000) / 0x0010000000000000 - 1023)
END