将1和0的32位二进制字符串转换为SQL Server中的带符号十进制数字
我正在使用SQL Server 2012 Express。我有一个1和0的32位长度的字符串。将1和0的32位二进制字符串转换为SQL Server中的带符号十进制数字
01010010000100010111001101110011
如何将其转换为SQL脚本中的带符号的十进制数?
目前我在网上使用了一个Web工具来回答我的问题,而我目前的搜索并没有将我引导到我需要的答案。
您可以尝试像下面 -
DECLARE @Binary VARCHAR(100) = '01010010000100010111001101110011';
DECLARE @characters CHAR(36),
@result BIGINT,
@index SMALLINT,
@base BIGINT;
SELECT @characters = 'abcdefghijklmnopqrstuvwxyz',
@result = 0,
@index = 0,
@base = 2;
WHILE @index < LEN(@Binary)
BEGIN
SELECT @result = @result + POWER(@base, @index) * (CHARINDEX(SUBSTRING(@Binary, LEN(@Binary) - @index, 1), @characters) - 1);
SET @index = @index + 1;
END
SELECT @result;
这将帮助你从任何碱转化(我用@base as 2
二进制)立足10.从最右边开始,移动到左边,直到我们用完数字。转换是(base^index)*数字。
我要感谢你Abhishek和Giorgos Betsos。我最终在我的代码中使用了Abhishek的例子。这两个例子都产生了相同的结果,但结果没有签名,它们是无符号的。所以我在Abhishek的代码末尾添加了这样的代码来获得我的结果。 – Skozzy
如果使用帐簿桌可以执行与一个T-SQL语句转换:
;WITH Tally(i) AS (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS i
FROM (VALUES (0), (0), (0), (0), (0), (0), (0), (0)) a(n)
CROSS JOIN (VALUES (0), (0), (0), (0)) b(n)
)
SELECT SUM(t.v) AS DecimalNumber
FROM (
SELECT POWER(CAST(SUBSTRING(x.d, i, 1) AS DECIMAL(10,0)) * 2, 32 - i)
FROM (VALUES ('01010010000100010111001101110011')) x(d)
CROSS JOIN Tally) AS t(v)
说明:
-
Tally
是表表达式1返回所有值-32。 - 使用这些值,我们可以使用
SUBSTRING
从二进制字符串中提取每个数字。 - 通过使用
POWER
数学函数,我们可以将每个单独的二进制数字转换为十进制数字。 - 使用
SUM
我们可以将所有单独的十进制数加起来以得到预期的结果。
我不得不将此代码添加到阿布舍克的代码示例月底获得签名的数字我需要的。 DECLARE @MyNewExValue INT IF @result > 2147483647 BEGIN SET @result = @result - (2147483648 * 2) END SET @MyNewExValue = @result SELECT @MyNewExValue
除了Giorgos Betsos的答复 见下文ITVF功能:
CREATE FUNCTION [dbo].[udf_BinaryToDecimal]
(
@Binary VARCHAR(31)
)
RETURNS TABLE AS RETURN
WITH Tally (n) AS
(
--32 Rows
SELECT TOP (LEN (@Binary)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1
FROM (VALUES (0),(0),(0),(0)) a(n)
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
)
SELECT
SUM(SUBSTRING(REVERSE(@Binary),n+1,1) * POWER(2,n)) TenBase
FROM Tally
/*How to Use*/
SELECT TenBase
FROM udf_BinaryToDecimal ('01010010000100010111')
/*Result -> 336151*/
http://improve.dk/converting-between-base-2-10-and-16-in-t -sql/ –