2015-09-27 2 views
0

Я использую SQL Server 2012 Express. У меня строка длиной 1 и 0 в 32 бит.Преобразование 32-разрядной двоичной строки из 1 и 0 в подписи десятичного числа в SQL Server

01010010000100010111001101110011 

Как бы преобразовать это в подписи десятичного числа в сценарий SQL?

В настоящее время я использую веб-инструмент онлайн для своего ответа, и мой текущий поиск не ведет меня к ответу, который мне нужен.

+0

http://improve.dk/converting-between-base-2-10-and-16-in-t -sql/ –

ответ

0

Вы можете попробовать, как показано ниже -

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) *.

+1

Я хотел бы поблагодарить вас Abhishek, а также Giorgos Betsos. Я закончил тем, что использовал пример Абхишека в своем коде. Оба примера дали одинаковые результаты, но результаты не были подписаны, они были неподписаны. Поэтому я добавил этот бит кода в конец кода Абхишека, чтобы получить результат. – Skozzy

3

Вы можете выполнить преобразование с помощью одного оператора T-SQL, если вы используете Tally таблицу:

;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, мы можем скомпоновать все отдельные десятичные числа, чтобы получить ожидаемый результат.

Demo here

0

мне пришлось добавить этот код в конце примера кода Абхишек, чтобы получить подписанную номер мне нужно. DECLARE @MyNewExValue INT IF @result > 2147483647 BEGIN SET @result = @result - (2147483648 * 2) END SET @MyNewExValue = @result SELECT @MyNewExValue

0

в дополнение к Giorgos Betsos «s ответить см 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*/ 
Смежные вопросы