gpt4 book ai didi

PHP 的 inet_pton() 转换 IPv4 和 IPv6

转载 作者:行者123 更新时间:2023-12-02 02:57:44 27 4
gpt4 key购买 nike

当我对 FE80:0000:0000:0000:0202:B3FF:FE1E:8329 使用 inet_pton() 时,我得到 ������ ) 不管那是什么。

然后我添加了 bin2hex() 并让这个 fe800000000000000202b3fffe1e8329 变得更好。

但是,我期望的是 16 个字符串,而不是 32 个字符串。

从那里开始变得更加不一致。

转换8.8.8.8时,我得到08080808字符串8。

<小时/>

有没有一种方法可以实现某种一致性,其中所有内容都具有相同的长度,或者我应该将其按原样添加到数据库中吗?

我正在寻找一种有效/快速的方法来完成此任务,这将导致更小的字符串,从而在我的数据库上占用更少的空间,而不会浪费太多资源。

最佳答案

IPv6地址的长度为128位; IPv4 地址的长度为 32 位。

这并非偶然:创建 IPv6 的主要动机之一是没有足够的 32 位地址来满足现代互联网的需求。

������) whatever that is.

即 128 位或 16 字节的二进制数据。尝试将其视为文本不会给您带来任何非常有趣的结果,因为并非每个位组合都是可显示的字符。

So then I added bin2hex() and get this fe800000000000000202b3fffe1e8329

将二进制字符串转换为十六进制意味着将每组 4 位表示为集合 0123456789abcdef 中的一个字符。结果是一个人类可读的字符串,但长度为 32 个字符 (128/4 = 32)。

您可能会注意到,编写 IPv6 地址的标准方式就是在该字符串中每 4 个字符添加一个 : 以提高可读性。

When converting 8.8.8.8 I get 08080808

在二进制中,IPv4 地址的长度为 32 位,即 4 个字节;但同样,这些并不都是可打印的字符。作为十六进制,它是一个 8 个字符长的字符串,因为它包含多少组 4 位 (32/4 = 8)。

Is there a way to achieve some consistency where everything is the same length

使 IPv4 地址和 IPv6 地址长度相同的唯一方法是在 IPv4 地址的左侧填充一些内容。这就像在说“我能让约翰的名字和萨曼莎的名字占据同样的空间吗”。

Am looking for an efficient/fast way to accomplish this that will result in a smaller string which would take less space on my database

最短的通用表示形式是您首先从 inet_pton 获得的二进制表示形式;只需确保将其存储在数据库中的二进制列中,而不是 VarChar/Text/etc 中。

或者,IPv6 的标准文本格式有一种简写方式,其中地址中的一系列 0 可以替换为 ::,因此 FE80:0000:0000:0000: 0202:B3FF:FE1E:8329 可以缩写为 FE80::0202:B3FF:FE1E:8329。我不知道有 PHP 函数可以生成这样的缩写,但是编写一个并不会太难。

如果您需要它是人类可读但简短的,您可以使用其他人类可读的二进制编码,例如 Base64 (即 natively supported by PHP )。 Base64 中的字符表示 6 位,但字符串通常会填充为 8 位和 6 位长的倍数,因此 IPv6 地址将占用 24 个可打印字符(128 位 + 16 位填充/6 = 24)。

其他更罕见的编码也是可能的,例如“Base85 ”,它使用更广泛的字符来使输出更短。但是,从数学上来说,它们都保证比二进制表示形式更长,因此您始终需要至少 16 个字节。

关于PHP 的 inet_pton() 转换 IPv4 和 IPv6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52484190/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com