• 【erlang】IPv6格式转IPv4


    erlang里面的httpd模块保存的http请求头里面,其中remote_addr 保存的是IPv6的格式。

    即使是IPv4,也会用IPv6的格式来保存。如

    {remote_addr, "0:0:0:0:0:FFFF:C0A8:4E01"}

    其实表示的就是IPv4为127.0.0.1的IPv6格式。

    虽然IPv6是趋势,但没使用,这样用起来很不方便。特别是我这边要实现一个IP白名单的功能。

    所以写了一个比较简单的转换方法。

    -module(test).
    -export([ipv6_2_ipv4/1]).
    
    
    %% V6 = "0:0:0:0:0:FFFF:C0A8:4E01".
    ipv6_2_ipv4(V6)->
        L1 = string:tokens(V6,":"),
        V4_7 = format(lists:nth(7, L1)),
        V4_8 = format(lists:nth(8, L1)),
        Ip1 = list_to_integer(string:substr(V4_7, 1, 2), 16),
        Ip2 = list_to_integer(string:substr(V4_7, 3, 2), 16),
        Ip3 = list_to_integer(string:substr(V4_8, 1, 2), 16),
        Ip4 = list_to_integer(string:substr(V4_8, 3, 2), 16),
        {Ip1, Ip2, Ip3, Ip4}.
    
    
    %% =================
    %% internal function
    %% =================
    format(Term) when length(Term) =:= 1 ->
        "000"++Term;
    format(Term) when length(Term) =:= 2 ->
        "00"++Term;
    format(Term) when length(Term) =:= 3 ->
        "0"++Term;
    format(Term) when length(Term) =:= 4 ->
        Term.
  • 相关阅读:
    Runloop运行循环的理解
    GCD dispatch_apply基本使用
    GCD信号量semaphore控制线程并发数
    多线程GCD dispatch_once_t/dispatch_barrier_<a>sync/dispatch_group_t
    iOS开发常用宏定义
    OC方法可变参数
    GCD的基本使用
    iOS实用小工具
    项目中实用第三方框架
    NSTimer内存泄漏问题
  • 原文地址:https://www.cnblogs.com/rond/p/4240341.html
Copyright © 2020-2023  润新知