字符型的IPV4地址轉(zhuǎn)int型存儲

最近剛參與一個小項目,看到同事在設(shè)計數(shù)據(jù)庫的時候,ipv4地址使用的類型是varcahr(50)進行存儲,瞬間感覺好low啊。。。


微信截圖_20181128155147.png

我們有兩周方法解決這種性能問題:
1.mysql的inet_aton和 inet_ntoa函數(shù)來完成,例如:


微信截圖_20181128155207.png

2.使用java代碼,按位運算來實現(xiàn)轉(zhuǎn)換(推薦),代碼如下:
思路:
我的ip:192.168.159.135
每段都可以用二進制表示:
192(10) = 11000000(2) ; 168(10) = 10101000(2) ;
159(10) = 10011111(2) ; 135(10) = 10000111(2)
192左移24位: 11000000 00000000 00000000 00000000
168左移16位: 00000000 10101000 00000000 00000000
159左移08位 : 00000000 00000000 10011111 00000000
135左移00位: 00000000 00000000 00000000 10000111
最后按位或得出結(jié)果:
11000000 10101000 10011111 10011111
代碼如下

package com.buka.algorithm;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class IPConvert {
    
    /**
     * 判斷是否為ipv4地址
     *
     */
    private static boolean isIPv4Address(String ipv4Addr) {
        String lower = "(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])"; // 0-255的數(shù)字
        String regex = lower + "(\\." + lower + "){3}";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(ipv4Addr);
        return matcher.matches();
    }

    public static int ipToInt(String ip) {

        if (!isIPv4Address(ip))
            throw new RuntimeException("ip地址錯誤!");

        Pattern pattern = Pattern.compile("\\d+");
        Matcher matcher = pattern.matcher(ip);

        int result = 0;
        int counter = 0;
        while(matcher.find()) {
            int value = Integer.parseInt(matcher.group());
            result = (value << 8 * (3 - counter++)) | result;
        }
        return result;
    }

    public static String intToIP(int ipNum) {
        StringBuilder sb = new StringBuilder();
        int num = 0;
        boolean needPoint = false;

        for (int i=0; i<4; i++) {
            if (needPoint)
                sb.append(".");
            needPoint = true;
            int offset = 8 * (3 - i);

            num = (ipNum >> offset) & 0xff;
            sb.append(num);
        }

        return sb.toString();
    }
    public static void main(String[] args) {
        System.out.println(intToIP(-1062690937));
    }
}

拒絕low代碼從我做起!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.1 IP地址基礎(chǔ) 什么是IP地址:IP地址是可以唯一表示IP網(wǎng)絡(luò)中的每臺設(shè)備。 每臺...
    ssdsss閱讀 2,097評論 0 1
  • IP地址的分類(記住) IP地址分為A類、B類、C類、D類、E類,規(guī)定如下: A類:網(wǎng)絡(luò)位8位,主機位24位,網(wǎng)絡(luò)...
    Arya鑫閱讀 13,201評論 1 18
  • 他從夢魘中醒來, 世界是亮著LED燈的屋頂, 燈光刺眼, 透著冰冷的慘白, 人影憧憧, 動一動手指, 抵觸到?jīng)鰶龅?..
    汀甘棠閱讀 832評論 18 14
  • 試想一下這樣的場景: 門前的鎖鑰匙不見了,你會怎么辦呢? 是盯著鎖,還是到別的地方其找找鑰匙呢?答案不言而明,當然...
    屠龍女青年閱讀 416評論 1 1
  • 每當節(jié)假日時 深圳的周圍 都掛上了 紅色的絲帶 甚至紫色的 總是 進出不易 其實 他是...
    桓舟子閱讀 122評論 2 0

友情鏈接更多精彩內(nèi)容