【问题标题】:how to convert hexadecimal ipv6 string seperated by : to decimal in PostgreSQL如何在PostgreSQL中将由:分隔的十六进制ipv6字符串转换为十进制
【发布时间】:2018-03-18 17:28:40
【问题描述】:

我正在尝试将十六进制字符串转换为 IPV6 地址的 NUMERIC 列 十六进制输入为2001:200:101:ffff:ffff:ffff:ffff:ffff 我的输出应该是42540528727106952925351778646877011967 我通过将我的输入消除: 作为2001200101ffffffffffffffffffff 来尝试了从该站点获取的以下函数

`CREATE OR REPLACE FUNCTION hex_to_int(hexval varchar) RETURNS numeric AS $$
DECLARE
  result  NUMERIC;
  i integer;
  len integer;
  hexchar varchar;
BEGIN

  result := 0;
  len := length(hexval);

  for i in 1..len loop
    hexchar := substr(hexval, len - i + 1, 1);
    result := result + 16 ^ (i - 1) * case
      when hexchar between '0' and '9' then cast (hexchar as int)
      when upper (hexchar) between 'A' and 'F' then ascii(upper(hexchar)) - 55
    end;
  end loop;

 RETURN result;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE STRICT;`

我得到十进制数

select hex_to_int('2001200101ffffffffffffffffffff');
              hex_to_int
--------------------------------------
 166176317495821453702777150266933247

如何得到我的实际十进制数?

【问题讨论】:

  • 您能否详细说明您的问题?我在这里尝试了这个函数,它为给定的十六进制值提供了正确的十进制数。
  • 你有166176317495821453702777150266933247作为十进制数,如果你将0x2001200101ffffffffffffffffffff转换为十进制,你实际上得到166176317495821453702777150266933247,所以我看不出问题。
  • 感谢您的回复,我的十六进制输入是2001:200:101:ffff:ffff:ffff:ffff:ffff 我需要转换为十进制为42540528727106952925351778646877011967
  • 你必须描述你是如何得出这个结果的。

标签: postgresql hex decimal ipv6


【解决方案1】:

问题中的十进制结果是问题中十六进制数的正确结果。

您缺少的是第二个和第三个 IPv6 地址字中被抑制的前导零。您错误地将 IPv6 地址字符串表示 (2001:200:101:ffff:ffff:ffff:ffff:ffff) 转换为实际的十六进制数字 (200102000101ffffffffffffffffffff)。注意添加的零位。每个 IPv6 单词都是四个十六进制数字,但允许(RFC 5952 要求)在字符串表示的单词中隐藏前导零,但这并不意味着它们不存在。

在删除冒号之前,您需要确保每个 IPv6 地址字是四个十六进制数字(添加任何缺失的零以获得四位数字,并将所有双冒号替换为正确数量的 0000 字)。


似乎没有任何真正合理的理由将 IPv6 地址转换为十进制表示。 IP 地址(IPv4 和 IPv6)都是二进制数,而 IPv6 的十六进制表示直接转换为二进制。添加小数只是自找麻烦。

【讨论】:

  • 谢谢罗恩,我尝试在每个十六进制集合 2001:200:101:ffff:ffff:ffff:ffff:ffff 到 2001:0200:0101:ffff:ffff:ffff:ffff:ffff 的前缀中添加零,并尝试使用相同的函数,我得到了精确的转换结果 select ip_control.hex_to_int('200102000101ffffffffffffffffffff'); hex_to_int 42540528727106952925351778646877011967
猜你喜欢
  • 2015-02-18
  • 1970-01-01
  • 2011-08-25
  • 2014-04-28
  • 2019-07-27
  • 2018-01-22
  • 2013-02-07
  • 2017-08-23
  • 2014-03-19
相关资源
最近更新 更多