Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Преобразование integer в 4 байта  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
Есть таблица IP-адресов (integer), как правильно распарсить байты?
На C# я бы сделал через сдвиги, а тут как?
13 май 14, 12:14    [16009324]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование integer в 4 байта  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Делением на степени 256.

Сообщение было отредактировано: 13 май 14, 12:18
13 май 14, 12:18    [16009365]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование integer в 4 байта  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
Это извращение, а как иначе?
declare @ip integer
set @ip = 1475729424
declare @a integer
declare @b integer
declare @c integer
declare @d integer

set @a = @ip/256/256/256
set @b = (@ip - @a*256*256*256)/256/256
set @c = (@ip - @a*256*256*256 - @b*256*256)/256
set @d = (@ip - @a*256*256*256 - @b*256*256 - @c*256)
select @a,@b,@c,@d
13 май 14, 12:19    [16009382]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование integer в 4 байта  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Или даже так покороче:

declare 
    @ip int = 2130706433

declare 
    @ip_bin binary (4) = @ip
select 
    cast (substring ( @ip_bin, 1, 1 ) as int)
    , cast (substring ( @ip_bin, 2, 1 ) as int)
    , cast (substring ( @ip_bin, 3, 1 ) as int)
    , cast (substring ( @ip_bin, 4, 1 ) as int)
13 май 14, 12:22    [16009393]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование integer в 4 байта  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
(IP&0x000000FF)/POWER(2,0*8)
(IP&0x0000FF00)/POWER(2,1*8)
(IP&0x00FF0000)/POWER(2,2*8)
(IP&0xFF000000)/POWER(2,3*8)
13 май 14, 12:26    [16009430]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование integer в 4 байта  [new]
user89
Member

Откуда:
Сообщений: 2083
iap,

наоборот...
declare @ip_int bigint = 3232251748
select (@ip_int&0xFF000000)/power(2,3*8), (@ip_int&0x00FF0000)/power(2,2*8), (@ip_int&0x0000FF00)/power(2,1*8), (@ip_int&0x000000FF)/power(2,0*8)

-- Из строки в bigint
declare @ip_str varchar(15) = '192.168.63.100'
select cast(parsename(@ip_str , 1) as tinyint) + cast(parsename(@ip_str, 2) as tinyint)*cast(256 as bigint) +
cast(parsename(@ip_str, 3) as tinyint)*cast(65536 as bigint) + cast(parsename(@ip_str, 4) as tinyint)*cast(16777216 as bigint)
13 май 14, 12:50    [16009579]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование integer в 4 байта  [new]
invm
Member

Откуда: Москва
Сообщений: 9915
declare @ip_int bigint = 3232251748;

select
 cast(substring(cast(@ip_int as binary(4)), 1, 1) as tinyint),
 cast(substring(cast(@ip_int as binary(4)), 2, 1) as tinyint),
 cast(substring(cast(@ip_int as binary(4)), 3, 1) as tinyint),
 cast(substring(cast(@ip_int as binary(4)), 4, 1) as tinyint);
13 май 14, 13:29    [16009835]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить