|
|
|
ASA 7 - ошибка при возврате функцией значения типа unsigned int
|
|||
|---|---|---|---|
|
#18+
Исходная задача - преобразовать 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2004, 09:33 |
|
||
|
ASA 7 - ошибка при возврате функцией значения типа unsigned int
|
|||
|---|---|---|---|
|
#18+
Конечно, у тебя IP-адрес из диапазона целых чисел вылезает. Попробуй применить DOUBLE. Или сделать это на клиенте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2004, 15:03 |
|
||
|
ASA 7 - ошибка при возврате функцией значения типа unsigned int
|
|||
|---|---|---|---|
|
#18+
Я знаю, что вылезает, поэтому и хочу привести к unsigned integer, ведь тогда влезет! И еще вопрос - с подобной задачей никто не встречался, может у же есть готовое решение, чтобы велосипед не изобретать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2004, 12:10 |
|
||
|
ASA 7 - ошибка при возврате функцией значения типа unsigned int
|
|||
|---|---|---|---|
|
#18+
автор Я знаю, что вылезает, поэтому и хочу привести к unsigned integer, ведь тогда влезет! Да НЕ ВЛЕЗЕТ, е-мое, скока раз-то повторять??? Число 999 999 999 999 превышает лимит 4-х байтового инта. Попробуй сделать это через стринг, типа select string(num_ip_addr) into @str_ip_addr, и дальше работай со стрингом @str_ip_addr ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2004, 12:25 |
|
||
|
ASA 7 - ошибка при возврате функцией значения типа unsigned int
|
|||
|---|---|---|---|
|
#18+
Кстати, вот это Код: plaintext 1. 2. 3. 4. представить IP-адрес в виде int. Смотрите, допустим IP-адрес=192.168.1.1 Итак, если он хранится в базе в виде 19216811, тогда @b1=19216811/256/256/256=1.145411193370819091796875 - херня-ссс. Если он хранится в базе в виде 192168001001, тогда @b1=192168001001/256/256/256=11454.105436861515045166015625 - снова херня-ссс. Должно было по идее получиться 192 :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2004, 16:16 |
|
||
|
ASA 7 - ошибка при возврате функцией значения типа unsigned int
|
|||
|---|---|---|---|
|
#18+
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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2004, 17:51 |
|
||
|
ASA 7 - ошибка при возврате функцией значения типа unsigned int
|
|||
|---|---|---|---|
|
#18+
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") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2004, 18:08 |
|
||
|
ASA 7 - ошибка при возврате функцией значения типа unsigned int
|
|||
|---|---|---|---|
|
#18+
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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2004, 18:18 |
|
||
|
ASA 7 - ошибка при возврате функцией значения типа unsigned int
|
|||
|---|---|---|---|
|
#18+
White OwlКто будет хранить 192.168.1.1 как 19216811??? Как ты догадаешься в каком месте точки ставить надо? :) Я и не собираюсь, наоброт я акцентировал на этом внимание автора топика :) White OwlНе надо записывать числа с 256 как число с базой в 1000. Опять же - вопрос к автору топика. Это я исследовал его код на примере :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2004, 18:30 |
|
||
|
ASA 7 - ошибка при возврате функцией значения типа unsigned int
|
|||
|---|---|---|---|
|
#18+
Уууу, что-то я затупил... Конечно, если IP-адрес хранится в виде 256*256*256*x1+256*256*x2+256*256*x3+256*x4, то unsigned int хватит за глаза Тогда самый простой вариант, наверное - преобразовать поле для IP-адреса в unsigned int. Или попробовать использовать CAST. Может, он спасет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2004, 18:45 |
|
||
|
ASA 7 - ошибка при возврате функцией значения типа unsigned int
|
|||
|---|---|---|---|
|
#18+
народ, мы вчерась сделали очень просто- стали оперировать только с signed int и если числа уходят в отрицательные - прибавляли 4294967296 (ну то есть 0x100000000) :-) собсна в базе изначально IP хранятся как signed int и в таком виде и надо работать с ними: ведь тогда их легко сравнивать, диапазоны выделять и проч., что со стрингами - труднее и медленнее. Сосбна вопрос наверное в следующем: ах, почему в ASA нету функции inet_ntoa и иже с ней :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2004, 19:30 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=32604763&tid=2014359]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
155ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 262ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...