powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA 7 - ошибка при возврате функцией значения типа unsigned int
11 сообщений из 11, страница 1 из 1
ASA 7 - ошибка при возврате функцией значения типа unsigned int
    #32600820
@lexx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исходная задача - преобразовать IP-адресс, кт хранится в базе ASA 7 как integer в символьную форму ( "192.168.1.1" )

Я пошел таким путем:
Есть функция, кт преобразует IP-адрес, кт хранится в базе ASA 7 как integer
в строку.
Была попытка преобразовать входное значение типа int в unsigned int
для того, чтобы работать с численным значением IP без знака. Тк в АSA я не нашел побитового сдвига чтобы можно было работать с байтом, в кт хранится знак, то был выбран путь преобразования к unsigned int

*1 - объявление переменной, в кт будет преобразованное значение
*2 - на этой строчке не работает
те если мы передаем в функцию значение, большее значения MAX_INT, то он
это значение не конвертирует в беззнаковое.. и при вызове функции выдает еррор:
"Value -1017871421 out of range for destination".
а правильное строковое значение, кт соответствует этому значению -
"192.168.64.14"

Не подскажете как побороть данную проблему, или как может по-другому решить исходную задачу.

Спасибо.

------------- Вывод результата ------------
begin
declare @ip_1 int
declare @ip_str varchar(15)
select @ip_1 = -1017871421
select @ip_str = IP2Str ( @ip_1 )
select @ip_str
end
------------ Функция ---------------------------
create function IP2Str (@IP_in integer)
Returns varchar(15)
begin
declare @IP_str varchar(15),
@nnn unsigned integer, -- !!!!!!!! *1
@b1 integer,
@b2 integer,
@b3 integer,
@b4 integer

select @nnn = convert(unsigned integer, @IP_in ) -- !!!!!!!!!!!!! *2

select @b1=@nnn/256/256/256
select @b2=(@nnn-@b1*256*256*256)/256/256
select @b3=(@nnn-@b1*256*256*256-@b2*256*256)/256
select @b4=@nnn-@b1*256*256*256-@b2*256*256-@b3*256
select @IP_str=STRING(@b1) || '.' || STRING(@b2) || '.' || STRING(@b3) || '.' || STRING(@b4)
return(@IP_str)
end
...
Рейтинг: 0 / 0
ASA 7 - ошибка при возврате функцией значения типа unsigned int
    #32601947
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно, у тебя IP-адрес из диапазона целых чисел вылезает.
Попробуй применить DOUBLE. Или сделать это на клиенте.
...
Рейтинг: 0 / 0
ASA 7 - ошибка при возврате функцией значения типа unsigned int
    #32603480
Alexxander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я знаю, что вылезает, поэтому и хочу привести к unsigned integer, ведь тогда влезет!

И еще вопрос - с подобной задачей никто не встречался, может у же есть готовое решение, чтобы велосипед не изобретать?
...
Рейтинг: 0 / 0
ASA 7 - ошибка при возврате функцией значения типа unsigned int
    #32603528
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Я знаю, что вылезает, поэтому и хочу привести к unsigned integer, ведь тогда влезет!


Да НЕ ВЛЕЗЕТ, е-мое, скока раз-то повторять??? Число
999 999 999 999 превышает лимит 4-х байтового инта.
Попробуй сделать это через стринг, типа select string(num_ip_addr) into @str_ip_addr, и дальше работай со стрингом @str_ip_addr
...
Рейтинг: 0 / 0
ASA 7 - ошибка при возврате функцией значения типа unsigned int
    #32604329
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, вот это
Код: plaintext
1.
2.
3.
4.
select @b1=@nnn/ 256 / 256 / 256 
select @b2=(@nnn-@b1* 256 * 256 * 256 )/ 256 / 256 
select @b3=(@nnn-@b1* 256 * 256 * 256 -@b2* 256 * 256 )/ 256 
select @b4=@nnn-@b1* 256 * 256 * 256 -@b2* 256 * 256 -@b3* 256 
как мне кажется не приведет к желаемому результату, даже если удастся
представить IP-адрес в виде int.

Смотрите, допустим IP-адрес=192.168.1.1

Итак, если он хранится в базе в виде 19216811, тогда
@b1=19216811/256/256/256=1.145411193370819091796875 - херня-ссс.


Если он хранится в базе в виде 192168001001, тогда
@b1=192168001001/256/256/256=11454.105436861515045166015625 - снова херня-ссс.

Должно было по идее получиться 192 :)
...
Рейтинг: 0 / 0
ASA 7 - ошибка при возврате функцией значения типа unsigned int
    #32604653
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mustliveДа НЕ ВЛЕЗЕТ, е-мое, скока раз-то повторять??? Число
999 999 999 999 превышает лимит 4-х байтового инта.
Попробуй сделать это через стринг, типа select string(num_ip_addr) into @str_ip_addr, и дальше работай со стрингом @str_ip_addr
Извините меня, конечно, но откуда ты взял число 999 999 999 999 если в исходной задаче речь шла об IP-адресах? :) Максимальным числом может быть только 255255255255, который просто идеально укладывается в 32-х битное беззнаковое целое. Собственно изначально IP адрес и есть 32-х битовое беззнаковое целое :)

Хранить IP адрес как integer в ASA нельзя. Потому что Integer в ASA является знаковым. 32-х битным. 31 бит на мантиссу плюс один бит на знак.
Функция convert не должна и не будет изменять данные. Она на это не способна по определению, потому-то и не работает функция приведеная в первом письме топика. Ну не может convert превратить знаковый бит в числовой.
А вот для адресов у которых первая цифра меньше 127 - приведеная функция будет работать без проблем :)

С самого начала надо было хранить IP адреса как unsigned integer. В крайнем случае как numeric(12,0)
...
Рейтинг: 0 / 0
ASA 7 - ошибка при возврате функцией значения типа unsigned int
    #32604680
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WhiteOwl
Извините меня, конечно, но откуда ты взял число 999 999 999 999 если в исходной задаче речь шла об IP-адресах? :) Максимальным числом может быть только 255255255255, который просто идеально укладывается в 32-х битное беззнаковое целое. Собственно изначально IP адрес и есть 32-х битовое беззнаковое целое :)

Насчет 999... это я конечно увлекся. :) Но все равно, 32-х битовое целое -
это 0xFFFFFFFF, или 4294967295. Ты не путай теплое с мягким :)

WhiteOwl
С самого начала надо было хранить IP адреса как unsigned integer. В крайнем случае как numeric(12,0)

Я думаю, лучше хранить как стринг. Все равно, IP-адрес в основном используется кусками. И ОБЯЗАТЕЛЬНО при этом - в виде 12-ти символьной
строки, чтобы можно было на тройки разбивать (например, 12 хранить как "012")
...
Рейтинг: 0 / 0
ASA 7 - ошибка при возврате функцией значения типа unsigned int
    #32604703
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mustlive
Смотрите, допустим IP-адрес=192.168.1.1
Итак, если он хранится в базе в виде 19216811, тогда
@b1=19216811/256/256/256=1.145411193370819091796875 - херня-ссс.

Кто будет хранить 192.168.1.1 как 19216811??? Как ты догадаешься в каком месте точки ставить надо? :)

begin
declare @ip unsigned integer;
declare @b1 unsigned integer;
declare @b2 unsigned integer;
declare @b3 unsigned integer;
declare @b4 unsigned integer;

set @ip = (convert(unsigned integer, 192)*256*256*256) + (168*256*256) + (001*256) + (001);
set @b1 = @ip/256/256/256;
set @b2 = (@ip - @b1*256*256*256)/256/256;
set @b3 = (@ip - @b1*256*256*256 - @b2*256*256)/256;
set @b4 = (@ip - @b1*256*256*256 - @b2*256*256 - @b3*256);
select @ip, @b1, @b2, @b3, @b4;
end;


mustlive
Если он хранится в базе в виде 192168001001, тогда
@b1=192168001001/256/256/256=11454.105436861515045166015625 - снова херня-ссс.

Должно было по идее получиться 192 :)
Не надо записывать числа с 256 как число с базой в 1000.
begin
declare @ip numeric(12);
declare @b1 numeric(3);
declare @b2 numeric(3);
declare @b3 numeric(3);
declare @b4 numeric(3);

set @ip = 192168001001;
set @b1 = @ip/1000/1000/1000;
set @b2 = (@ip - @b1*1000*1000*1000)/1000/1000;
set @b3 = (@ip - @b1*1000*1000*1000 - @b2*1000*1000)/1000;
set @b4 = (@ip - @b1*1000*1000*1000 - @b2*1000*1000 - @b3*1000);
select @ip, @b1, @b2, @b3, @b4;
end;
...
Рейтинг: 0 / 0
ASA 7 - ошибка при возврате функцией значения типа unsigned int
    #32604735
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlКто будет хранить 192.168.1.1 как 19216811??? Как ты догадаешься в каком месте точки ставить надо? :)

Я и не собираюсь, наоброт я акцентировал на этом внимание автора топика :)

White OwlНе надо записывать числа с 256 как число с базой в 1000.

Опять же - вопрос к автору топика. Это я исследовал его код на примере :)
...
Рейтинг: 0 / 0
ASA 7 - ошибка при возврате функцией значения типа unsigned int
    #32604763
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уууу, что-то я затупил...
Конечно, если IP-адрес хранится в виде 256*256*256*x1+256*256*x2+256*256*x3+256*x4, то unsigned int хватит за глаза
Тогда самый простой вариант, наверное - преобразовать поле для IP-адреса в unsigned int. Или попробовать использовать CAST. Может, он спасет
...
Рейтинг: 0 / 0
ASA 7 - ошибка при возврате функцией значения типа unsigned int
    #32604808
Их есть у меня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
народ, мы вчерась сделали очень просто-
стали оперировать только с signed int и
если числа уходят в отрицательные - прибавляли 4294967296
(ну то есть 0x100000000) :-)

собсна в базе изначально IP хранятся как signed int и
в таком виде и надо работать с ними: ведь тогда
их легко сравнивать, диапазоны выделять и проч.,
что со стрингами - труднее и медленнее.

Сосбна вопрос наверное в следующем:
ах, почему в ASA нету функции inet_ntoa и иже с ней :-)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA 7 - ошибка при возврате функцией значения типа unsigned int
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]