Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/22: Рейтинг темы: голосов - 22, средняя оценка - 4.64
19 / 11 / 0
Регистрация: 02.09.2010
Сообщений: 235
1

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

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

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2012, 00:40
Ответы с готовыми решениями:

Перевести длинную бинарную строку в строку с десятичными цифрами
Добрый день. Проблема следующая: есть бинарное число...

Получение данных с Com-порта, преобразование строки в бинарную последовательность
Всем доброго времени суток! Недавно начал ковырять Visual C++. Понимаю, что полез в дебри...

Получить бинарную строку
Здравствуйте. Есть зубчатый массив целых чисел. Нужно его сериализовать и получить из этого...

Преобразование DNS имени в IPv6
С недавнего времени, некоторые компьютеры в локальной сети при пинге доменного имени пингуются по...

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

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

Вот сюда я закинул исходник который тебе нужен
Перевод в 9-чную систему счисления
1
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
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
385 / 229 / 12
Регистрация: 06.07.2011
Сообщений: 512
08.02.2012, 00:41 4
инициализировать бинарное поле нулями. обойти адрес с начала, преобразовывая и записывая блоки, до первой встречи ::. если не встретилось, то все ок, бинарная строка получена. если встретилось, то начать обход блоков с конца, до встречи ::. т.к. двух :: в одном адресе быть не может, то должно сработать.
1
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
08.02.2012, 10:19 5
> Есть ли специальная рабочая функция чтобы туда поместить ipv6 адрес?

getaddrinfo
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 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
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
21.02.2012, 21:44 7
128 bit integer есть в GCC:
http://gcc.gnu.org/onlinedocs/... nt128.html
Знаковый объявляется так:
C++
1
__int128 i=0;
Беззнаковый так:
C++
1
unsigned __int128 i=0;
Если кто знает рабочую функцию для перевода IPv6 в integer, выложите здесь, мне тоже нужно
0
21.02.2012, 21:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.02.2012, 21:44
Помогаю со студенческими работами здесь

Записать бинарную строку в SQLite
Есть бинарная строка длинна строки известна. Мне надо ее записать в базу SQLite. Использую PHP7....

Привести бинарную строку к регулярному виду
В Perl 5 конвертировать строку в бинарный вид и обратно можно так: echo -n this is string | perl...

Передать бинарную строку в виде последовательности байт, перед которой идёт её длина
Помогите, пожалуйста. У меня есть строка $string. Мне нужно её передать в виде последовательности...

DHCP IPv6, тунелирование IPv6 в Cisco
Здравствуйте! у меня диплом на тему:маршрутизация IPv6: DHCP,тунелирование. Мне интересна эта тема...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru