美好的一天,
我有一些二进制字符串是由带有结构的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,所以上面的碎片可能是非法的,但你得到了这个概念。我在帮助一位同事。
答案 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