Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
#1

Преобразование ipv6 в бинарную строку - C++

07.02.2012, 00:40. Просмотров 1020. Ответов 6
Метки нет (Все метки)

IPv6 адрес это 128-битный адрес. Он разделяется на части по 16 бит, которые преобразуются в 4-значные шестнадцатеричные числа и разделяются двоеточиями.
Представление адресов IPv6 может быть еще более упрощено путем удаления начальных нулей в каждом 16-битном блоке.
ля дальнейшего упрощения адресов IPv6 сплошные последовательности 16-битных блоков из нулей (0) в двухточечно-шестнадцатеричном формате могут быть сокращены до :: (т. н. двойное двоеточие).

В природе адрес может быть таким:
FF02::2
И таким:
2001:330:19:1ef::1
И таким:
2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d
Логика преобразования в бинарную форму довольно сложна...

Нужно это всё как-то хранить и обрабатывать.
К примеру у меня есть массив char ipv6[16]
Есть ли специальная рабочая функция чтобы туда поместить ipv6 адрес? Или может быть кто-то реализовывал подобную?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2012, 00:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преобразование ipv6 в бинарную строку (C++):

Перевести длинную бинарную строку в строку с десятичными цифрами - C++
Добрый день. Проблема следующая: есть бинарное число 11010111010111111110.......11100011010110110 - необходимо его представить в виде...

Преобразование числа в строку - C++
Как преобразовать строку char *s, в которой записано число(возможно со знаком минус), в формат типа long 1) в строке десятичное число ...

Преобразование числа в строку - C++
Подскажите как преобразовать число в строку, пожалуйста!

Преобразование число в строку - C++
Привет ребята, хочу спросить как с помощь printf число можно переобразовать в строку? Например через itoa это можно сделать вот так: ...

Преобразование числа в строку - C++
Всем доброго времени суток, помогите пожалуйста получить из числа 12345679 (int), строку string = {1, 2, 3, 4, 5, 6, 7, 8, 9}. т.е....

Преобразование строки в строку? - C++
Есть вот такая вот ошибка Ключевые строки кода: Student *arr = new Student; string *value = new string; cin >> *value; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,460
07.02.2012, 01:35 #2
Я всё понял кроме этого:
"Для дальнейшего упрощения адресов IPv6 сплошные последовательности 16-битных блоков из нулей (0) в двухточечно-шестнадцатеричном формате могут быть сокращены до :: (т. н. двойное двоеточие)."
То есть я так понял, если в блоке ОДНИ ноли, то они заменяются двоеточием?

А вобще вся это делается на раз. Если моё предположение на счёт двоеточий верно, то замени его вручную нолям и используй готовый инструсмент

Вот сюда я закинул исходник который тебе нужен
Перевод в 9-чную систему счисления
1
igorrr37
1647 / 1275 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
08.02.2012, 00:28 #3
Можно сделать через регексы, вместо char удобней unsigned short, если правильно понял прога должна переводить std::string в vector<unsigned short> в правильном порядке
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <boost/regex.hpp>
#include <sstream>
 
int main()
{
    std::string s("07a0:765d::");
    std::size_t colons = std::count(s.begin(), s.end(), ':');
    boost::smatch res;
    boost::regex reg("([a-fA-F0-9]{0, 4}):?([a-fA-F0-9]{0, 4}):?([a-fA-F0-9]{0, 4}):?([a-fA-F0-9]{0, 4}):?"
                     "([a-fA-F0-9]{0, 4}):?([a-fA-F0-9]{0, 4}):?([a-fA-F0-9]{0, 4}):?([a-fA-F0-9]{0, 4}):?");
    if(boost::regex_match(s, res, reg))
    {
        std::vector<unsigned short> v(8);
        std::size_t resSize = res.size();
        std::istringstream iss;
        for(int i = 1; i < resSize; ++i)
        {
            iss.str(res[i].str());
            iss >> std::hex >> v[i - 1];
            iss.clear();
        }
        std::rotate(v.begin(), v.begin() + colons + 1, v.end());
        for(int i = 0; i < 8; ++i)
        {
            std::cout << std::hex << v[i];
            if(i != 7) std::cout  << ':';
        }
    }
    else std::cerr << "Not match\n";
    return 0;
}
1
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
08.02.2012, 00:41 #4
инициализировать бинарное поле нулями. обойти адрес с начала, преобразовывая и записывая блоки, до первой встречи ::. если не встретилось, то все ок, бинарная строка получена. если встретилось, то начать обход блоков с конца, до встречи ::. т.к. двух :: в одном адресе быть не может, то должно сработать.
1
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
08.02.2012, 10:19 #5
> Есть ли специальная рабочая функция чтобы туда поместить ipv6 адрес?

getaddrinfo
0
fasked
Эксперт С++
4937 / 2517 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
08.02.2012, 11:47 #6
Цитата Сообщение от Damaks Посмотреть сообщение
Есть ли специальная рабочая функция чтобы туда поместить ipv6 адрес?
C
1
2
ssize_t inet_pton(int af, const char *cp, void *ap);
char *inet_ntop(int af, const void *ap, char *cp, size_t len);
2
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
21.02.2012, 21:44 #7
128 bit integer есть в GCC:
http://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html
Знаковый объявляется так:
C++
1
__int128 i=0;
Беззнаковый так:
C++
1
unsigned __int128 i=0;
Если кто знает рабочую функцию для перевода IPv6 в integer, выложите здесь, мне тоже нужно
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2012, 21:44
Привет! Вот еще темы с ответами:

Преобразование из double в строку - C++
Здравствуйте, в общем такое дело, есть winapi приложение с подключаемой .dll, при подсчёте функция должна вывести в эдит дробный...

Преобразование объекта в строку - C++
Есть некий класс Object. Как сделать так, чтобы он был полностью совместим со string? Чтобы можно было делать например вот так: ...

Преобразование числа в строку!!!! - C++
Как в VS преобразовать число в строку!!! Через itoa что-то не выходит!!!

Преобразование цифр в строку - C++
Всем привет! Пишу небольшую программку, а именно просто идущие часы(такие же что тикают в нижнем правом углу) Так вот хочу выводить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.02.2012, 21:44
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru