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

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

Восстановить пароль Регистрация
 
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
07.02.2012, 00:40     Преобразование ipv6 в бинарную строку #1
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 адрес? Или может быть кто-то реализовывал подобную?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2012, 00:40     Преобразование ipv6 в бинарную строку
Посмотрите здесь:

Преобразование числа в строку!!!! C++
преобразование числа в строку C++
преобразование из double в строку C++
Преобразование строки в строку? C++
C++ Преобразование числа в строку
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
07.02.2012, 01:35     Преобразование ipv6 в бинарную строку #2
Я всё понял кроме этого:
"Для дальнейшего упрощения адресов IPv6 сплошные последовательности 16-битных блоков из нулей (0) в двухточечно-шестнадцатеричном формате могут быть сокращены до :: (т. н. двойное двоеточие)."
То есть я так понял, если в блоке ОДНИ ноли, то они заменяются двоеточием?

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

Вот сюда я закинул исходник который тебе нужен
Перевод в 9-чную систему счисления
igorrr37
 Аватар для igorrr37
1594 / 1222 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
08.02.2012, 00:28     Преобразование ipv6 в бинарную строку #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;
}
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
08.02.2012, 00:41     Преобразование ipv6 в бинарную строку #4
инициализировать бинарное поле нулями. обойти адрес с начала, преобразовывая и записывая блоки, до первой встречи ::. если не встретилось, то все ок, бинарная строка получена. если встретилось, то начать обход блоков с конца, до встречи ::. т.к. двух :: в одном адресе быть не может, то должно сработать.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
08.02.2012, 10:19     Преобразование ipv6 в бинарную строку #5
> Есть ли специальная рабочая функция чтобы туда поместить ipv6 адрес?

getaddrinfo
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
08.02.2012, 11:47     Преобразование ipv6 в бинарную строку #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);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2012, 21:44     Преобразование ipv6 в бинарную строку
Еще ссылки по теме:

Преобразование объекта в строку C++
Перевести длинную бинарную строку в строку с десятичными цифрами C++
Преобразование числа в строку C++

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

Или воспользуйтесь поиском по форуму:
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
21.02.2012, 21:44     Преобразование ipv6 в бинарную строку #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, выложите здесь, мне тоже нужно
Yandex
Объявления
21.02.2012, 21:44     Преобразование ipv6 в бинарную строку
Ответ Создать тему
Опции темы

Текущее время: 15:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru