The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"преобразование ip в integer"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"преобразование ip в integer"  
Сообщение от bromantik email(??) on 24-Мрт-08, 19:24 
Всем привет.
Если вопрос глупый, прошу не винить.
Ситуация следующая. В БД имеются ip-адреса в signed int.

Возникла необходимость сделать выборку с помощью bash.
Пошел по такому пути:
echo "ibase=10;obase=2;192" | bc   # и так для каждого октета 192-168-100-1

Получил бинарное представление. Но теперь, объеденив результаты и сконвертировав их в десятичное значение, я получил unsigned int.
Объясните пожалуйста, куда копать, что нужно сделать, чтобы получить из ip-адреса unsigned int?

И ещё вопрос, можно ли заставить bc показывать старшие биты, даже если они равны нулю, а то 10 означает 00001010, а bc показывает только 1010.

Большое спасибо

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "преобразование ip в integer"  
Сообщение от bromantik email(??) on 24-Мрт-08, 19:25 
Небольшая поправка:

Объясните пожалуйста, куда копать, что нужно сделать, чтобы получить из ip-адреса SIGNED int?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "преобразование ip в integer"  
Сообщение от angra (??) on 24-Мрт-08, 19:55 
зачем bc, арифметики bash не хватает?
let a=192*256*256*256+168*256*256+1*256+1; echo $a
3232235777
Однако возникнет проблема signed/unsigned, если вам действительно нужен signed, то сравнивайте первый октет с 128 и делайте соответствующие преобразования
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "преобразование ip в integer"  
Сообщение от bromantik email(??) on 24-Мрт-08, 20:05 
>зачем bc, арифметики bash не хватает?
>let a=192*256*256*256+168*256*256+1*256+1; echo $a
>3232235777
>Однако возникнет проблема signed/unsigned, если вам действительно нужен signed, то сравнивайте первый
>октет с 128 и делайте соответствующие преобразования

Большое спасибо.
действительно, про этот сособ не подумал.

Есть конечно вариант вычитать 2147483647, но как-то это топорно.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "преобразование ip в integer"  
Сообщение от angra (??) on 24-Мрт-08, 20:47 
Что тут топорного, кроме неправильного числа? :)
4294967295 это -1
4294967294 это -2
...
Так что вычитать надо 4294967296, но только когда старший октет больше 127


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "преобразование ip в integer"  
Сообщение от bromantik email(??) on 24-Мрт-08, 21:14 
>Что тут топорного, кроме неправильного числа? :)
>4294967295 это -1
>4294967294 это -2
>...
>Так что вычитать надо 4294967296, но только когда старший октет больше 127
>

Да, про число уже понял
Спасибо Вам огромное, просветили.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "преобразование ip в integer"  
Сообщение от idle (ok) on 24-Мрт-08, 22:09 
>Всем привет.
>Если вопрос глупый, прошу не винить.
>Ситуация следующая. В БД имеются ip-адреса в signed int.

В базе и конвертируйте.


mysql> select inet_aton('192.168.0.1');
+--------------------------+
| inet_aton('192.168.0.1') |
+--------------------------+
|               3232235521 |
+--------------------------+
mysql> select inet_ntoa('3232235521');
+-------------------------+
| inet_ntoa('3232235521') |
+-------------------------+
| 192.168.0.1             |
+-------------------------+
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "преобразование ip в integer"  
Сообщение от bromantik email(??) on 24-Мрт-08, 22:36 
>[оверквотинг удален]
>|            
>   3232235521 |
>+--------------------------+
>mysql> select inet_ntoa('3232235521');
>+-------------------------+
>| inet_ntoa('3232235521') |
>+-------------------------+
>| 192.168.0.1          
>  |
>+-------------------------+

Проблема в том, что данные signed, а aton и ntoa работают с беззнаковыми значениями.
Вообще, если кто-нибудь в моей голове наведёт порядок с этими знаками, благодарности моей предела не будет.
Ситуация в следующем, давным давно написал нетфлоу-коллектор, он кладёт ip-адреса, знаковые. Вебморда на php прекрасно с ними работает с помощью функций ip2long и long2ip. Но вот спустя несколько лет, понадобилось немного доделать всю эту халабуду и, если честно, вышла в голове путаница со знаками, даже не столько со знаками, как таковыми, сколько, как лучше жить, так или эдак?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "преобразование ip в integer"  
Сообщение от stas (??) on 25-Мрт-08, 00:25 
>[оверквотинг удален]
>Проблема в том, что данные signed, а aton и ntoa работают с
>беззнаковыми значениями.
>Вообще, если кто-нибудь в моей голове наведёт порядок с этими знаками, благодарности
>моей предела не будет.
>Ситуация в следующем, давным давно написал нетфлоу-коллектор, он кладёт ip-адреса, знаковые. Вебморда
>на php прекрасно с ними работает с помощью функций ip2long и
>long2ip. Но вот спустя несколько лет, понадобилось немного доделать всю эту
>халабуду и, если честно, вышла в голове путаница со знаками, даже
>не столько со знаками, как таковыми, сколько, как лучше жить, так
>или эдак?

http://forum.woweb.ru/topic22744.html

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "преобразование ip в integer"  
Сообщение от Аноним (??) on 25-Мрт-08, 04:34 
Знаковые и беззнаковые целые - абсолютно одно и то же. Разницу видно только если их сравнивать (больше/меньше) и сортировать. В остальном - юзай что угодно.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "преобразование ip в integer"  
Сообщение от angra (??) on 25-Мрт-08, 04:53 
Если вы хотите понимать разницу между signed/unsigned на уровне двоичной арифметики, то возьмите любую книжку типа "архитекура процессоров х86". Если хотите для повседневного пользования без перехода на особенности АЛУ, то достаточно три пункта
1. знак определяется старшим битом, вне зависимости от количества байт
2. диапазон signed по модулю равен половине unsigned
3. Отсчет отрицательных чисел идет в обратную сторону, то есть максимальное (по модулю) возможное unsigned число в диапазоне равно -1 для signed.

Если все же охота с точки зрения АЛУ, то могу показать пару примеров на уровне тетрады(четыре бита, кстати, были процессоры, например i4004, для которых слово было именно такой размерности):
0001 = 1 unsigned, 1 signed
1111 = 15 unsigned, -1 signed
0001+1111= 10000 ~ 0000 - ноль для signed и unsigned

0010 = 2 unsigned, 2 signed
1111 = 15 unsigned, -1 signed
0010+1111= 10001 ~ 0001 - 1 для signed и unsigned

0001 = 1 unsigned, 1 signed
1110 = 14 unsigned, -2 signed
0001+1110= 1111 - 15 для unsigned и -1 для signed
Как легко можно увидеть особенности знакового представления созданы так чтобы в АЛУ нужна была только одна операция - сложение. Вычитание не нужно.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "преобразование ip в integer"  
Сообщение от bromantik (??) on 25-Мрт-08, 08:44 
>[оверквотинг удален]
>
>0010 = 2 unsigned, 2 signed
>1111 = 15 unsigned, -1 signed
>0010+1111= 10001 ~ 0001 - 1 для signed и unsigned
>
>0001 = 1 unsigned, 1 signed
>1110 = 14 unsigned, -2 signed
>0001+1110= 1111 - 15 для unsigned и -1 для signed
>Как легко можно увидеть особенности знакового представления созданы так чтобы в АЛУ
>нужна была только одна операция - сложение. Вычитание не нужно.

Ну вроде прояснилось...
Всем большущее спасибо, angra особенное.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру