【问题标题】:JavaScript change IPv6 into IPv4? [duplicate]JavaScript 将 IPv6 更改为 IPv4? [复制]
【发布时间】:2014-06-02 12:31:32
【问题描述】:

我不是最擅长 JavaScript。不久前,我能够在 PHP 中获得一个不错的 ipv62long() 函数,并且能够帮助某人解决有关它的问题。但是在我看来,仅仅为了获得结果而发布到 PHP 是非常讨厌的。像这样的功能可以在 JavaScript 中实现吗?我在寻找什么功能来实现它?我尝试了无数次搜索,他们总是反馈给 PHP 示例。

function ipv62long( $ip ) {
    $binNum = '';
    foreach ( unpack('C*', inet_pton( $ip ) ) as $byte ) {
        $binNum .= str_pad( decbin( $byte ), 8, "0", STR_PAD_LEFT );
    }
    return base_convert( ltrim($binNum, '0' ), 2, 10 );
}

$ip = ipv62long(urldecode('2001%3a0%3a9d38%3a6abd%3a248d%3a2ee4%3a3f57%3afd26'));
echo $ip;
echo '<p>' . long2ip( $ip ) . '</p>';

【问题讨论】:

  • Java 是一种与 JavaScript 不同的语言,而 PHP @Thomas 我也在搜索栏上做了功课。
  • 语言与问题无关。
  • 你怎么看,问题在于用一种特定的语言来做这件事……哈哈
  • 您无法神奇地将 ipv6 转换为 ipv4,只能转换为 IPv6(4 到 6)IP。
  • 您显示的功能不会将 IPv6 转换为 IPv4。正如已经反复声明的那样,这是不可能的。要么你误解了发生了什么,要么你应该重写你的问题标题,或者两者兼而有之。

标签: javascript php ipv6 ipv4 data-conversion


【解决方案1】:

只是为了好玩,我也是用 PHP 做的:)

再解释一下 PHP: 我使用 inet_pton 获取二进制值,然后通过使用 OR 和位移来构建一个新的 long 值(4 个字节)。

由于inet_pton返回的是结构体,所以我使用ord来获取数据的十进制值。

然后我使用 NOT 反转 long 并将其传递给 long2ip...

<?PHP
$data = inet_pton(urldecode('2001%3a0%3a9d38%3a6abd%3a248d%3a2ee4%3a3f57%3afd26'));
// 192.168.2.217

// build a long 4 bytes using binary ORing
$ip_as_long = ord($data[15]);
$ip_as_long |= ord($data[14]) << 8;
$ip_as_long |= ord($data[13]) << 16;
$ip_as_long |= ord($data[12])<<24;

echo long2ip(~$ip_as_long);
?>

Javascript

 <script>
    var value = '2001:0:9d38:6abd:248d:2ee4:3f57:fd26';

    var split_str = value.split(':');
    value = split_str[6] + split_str[7];

    var ip_1 = ~parseInt(value.substring(0,2),16) & 0xFF;
    var ip_2 =~parseInt(value.substring(2,4),16) & 0xFF;
    var ip_3 =~parseInt(value.substring(4,6),16) & 0xFF;
    var ip_4 =~parseInt(value.substring(6,8),16) & 0xFF;

    alert(ip_1+'.'+ip_2+'.'+ip_3+'.'+ip_4);
    </script>

享受吧。

【讨论】:

  • 可以使用 Teredo 地址,但一般不适用于 IPv6。
  • 是的...我们认识这个聪明人...否则您无法将 IPv6 转换为 IPv4,我们已经知道,如果您阅读上面的 cmets...这就是他想要的!
  • @Thomas 冷静下来,不要那么自卫。 StackOverflow 是大量 Google 搜索的结果。这些人不应该阅读每条评论来弄清楚发生了什么。这些基本信息应该包含在答案本身中。
  • 我知道,但他对我投了反对票,因为他给出了一个完全适用的答案。
  • @Thomas 他从未说过他对你投了反对票,所以你只是在那里草草下结论。如果您编辑您的答案以纠正他所指出的内容,他完全有可能支持您,并且每个人都会更快乐。
猜你喜欢
  • 2013-01-04
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 2015-03-10
  • 2011-01-03
  • 2019-09-22
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多