我注意到 Go 在使用时创建了一个 4 字节 IPv4 地址的 16 字节内部表示:
// IPv4 returns the IP address (in 16-byte form) of the
// IPv4 address a.b.c.d.
func IPv4(a, b, c, d byte) IP {
p := make(IP, IPv6len)
copy(p, v4InV6Prefix)
p[12] = a
p[13] = b
p[14] = c
p[15] = d
return p
}
https://golang.org/src/net/ip.go
IPv4 最初创建时有 16 个字节是有原因的吗?我正在为 Broadcast 和 Networkaddress 做一些计算,我直接访问了内部 byte[] 并且很困惑我必须调用 To4()
来做类似的事情
start := binary.BigEndian.Uint32([]byte(ip))
并实际获取 IPv4 地址作为 uint32。
最佳答案
看起来他们使用的表示法允许他们使用相同的代码轻松处理 IPv4 和 IPv6 地址。他们对任一类型的 IP 使用单一的 16 字节表示。
代码顶部的注释(您链接到的)解释得很清楚:
// IPv4 addresses are 4 bytes; IPv6 addresses are 16 bytes.
// An IPv4 address can be converted to an IPv6 address by
// adding a canonical prefix (10 zeros, 2 0xFFs).
// This library accepts either size of byte slice but always
// returns 16-byte addresses.
您可以传入 4 字节或 16 字节的 IPv4 地址表示,但该库将在内部使用 16 字节的地址并始终返回它们。
关于go - 为什么 Go net.IPv4 会在内部创建一个 16 字节的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49141513/