将二进制转换为十六进制IPv6

时间:2014-03-25 19:49:49

标签: ipv6

我有一个二进制序列应该是IPv6,我不确定我是否正确转换了它,你能检查并告诉我它是否错了吗?

这是二进制序列:

0000000000000000 0001100000000000 0000011000000000 0000000000000000 0000000001100000 0000000000011000 0000000000000110 0000000000000001

这就是我得到的:

0:1800:600::60:18:6:1

谢谢!

更新:这是我用来生成十六进制值的算法:

IPv6由128位组成,我将其分为8个不同的16位组, 得到一组16位并将其分成4组4位 然后我将每组4位转换为十六进制,加入我得到的4个不同的值, 然后重复其余的(7组)16位(2B)。 之后我添加了':'在每组(现在)十六进制值之间。 找到并从组前面删除零,然后, 找到仅由零组成的最大子序列, 删除它们只留下" ::"代替。

1 个答案:

答案 0 :(得分:1)

如果这是一个IPv6地址,那么你的解码就是正确的(模数会导致重新排序字节的一些字节序问题)。不幸的是,每组128位都可以是IPv6地址。正如@Sander Steffann所说,您计算的IPv6地址目前无效。 RFC 4291描述了IPv6寻址体系结构,IANA IPv6 Address Space Assignments显示允许地址保留的内容。对于以8个零(0000 :: / 8)开头的地址,只有以下有效范围:未指定的地址,仅由零(:: / 128)组成;环回地址(:: 1/128); IPv4映射地址(:: ffff:0:0/96),以80个零位开始;和弃用的“IPv4兼容的IPv6地址”(0000 :: / 96),甚至以96个零位开始。


但是我对那个位序列的另一个问题是:它看起来太规律了。让我们看看会发生什么,如果我们用一点Perl来计算1和0:

$ echo "0000000000000000 0001100000000000 0000011000000000 0000000000000000 0000000001100000 0000000000011000 0000000000000110 0000000000000001" | perl -wple 's/ //g; s/(0+|1+)/length($1)."x".substr($1,0,1)." "/ge'
19x0 2x1 16x0 2x1 34x0 2x1 16x0 2x1 16x0 2x1 16x0 1x1

(代码只用1或0的每个序列替换长度,“x”和序列的第一个字符。)

如果我们排除开始和结束,我们总是有一个16个零的序列,然后是两个。 (在中间,我们有两个零而不是那些,所以总共有34个零序列。)

也许你正在查看比特序列的错误部分?