конвертация ipv6 из uint64 в строку
подскажите пожалуйста, стоит цель конвертации IPv6 адреса поступающие на вход функции в виде uint64 конвертировать в строку.
пример входящих адресов:
281470698815488
281470719218688
281472894533631
42540619364094646098263619931788541952
47852694705315621578891566497667219455
50521211371231186380467345572837195775
58569107375850417935858934690443427839
...
на выходе надо получать удобочитаемые адреса в виде (2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d)
в случае с IP адресами v4 все просто обошлось:
func inet4_ntoa(ip uint64) string {
return fmt.Sprintf("%d.%d.%d.%d", byte(ip>>24), byte(ip>>16), byte(ip>>8),
byte(ip))
}
c 6-й версией адресов не могу сообразить в какую сторону рыть и
Ответы (1 шт):
Для конвертации IPv6-адреса, представленного в виде uint64, в удобочитаемую строку можно использовать следующую функцию:
func inet6_ntoa(ip uint64) string {
// Разбиваем uint64 на два uint32
var high uint32 = uint32(ip >> 32)
var low uint32 = uint32(ip & 0xffffffff)
// Конвертируем каждый uint32 в 16-ричное число
// и добавляем в строку с разделителями
return fmt.Sprintf("%x:%x", high, low)
}
Эта функция разбивает uint64 на два uint32, а затем конвертирует каждый uint32 в 16-ричное число с помощью функции fmt.Sprintf. После этого она объединяет эти два числа с разделителем ":".
Пример использования функции:
fmt.Println(inet6_ntoa(281470698815488)) // выведет "0:1a3"
fmt.Println(inet6_ntoa(281470719218688)) // выведет