1. 程式人生 > >使用Python 3生成IPv6地址格式時遇到的lstrip()與切片的問題

使用Python 3生成IPv6地址格式時遇到的lstrip()與切片的問題

    今天應領導要求,要對學院獲取到的IPv6地址段進行規劃,拿到的地址字首是/48的,打算拿接下來的16位來作為子網地址,於是開始規劃子網。16位子網地址,能劃分出2^16=65536這麼多個子網,要是手工一個一個地列出來,估計我得先預約醫院的床位。第一個想到的是用Excel來完成。可是對Excel函式和VBA不熟悉,嘗試了半個多小時無果而終,還是自己寫個Python指令碼吧。
            第1版是這樣的:                

i = 0
while i < 65536:

s存放對應的二進位制數的str並去掉前導的'0b'

s =  bin( i ).lstrip( '0b' ),千萬不要用lstrip,它會去掉0
#如果s的長度不夠16位就在前面補0
while len( s ) < 16:
    s = '0' + s    
#將s的每4位轉換成一個大寫的十六進位制
h1 = hex( int( s[:4], 2 )).lstrip( '0x' ).upper()
h2 = hex( int( s[4:8], 2 )).lstrip( '0x' ).upper()
h3 = hex( int( s[8:12], 2 )).lstrip( '0x' ).upper()
h4 = hex( int( s[12:16], 2 )).lstrip( '0x' ).upper()
h =  h1 + h2 + h3 + h4
print( h )
i += 1

            執行的結果不太對:
            ……
            FFEF                
            FFF
            FFF1
            ……
            ‘0’去哪了?應該是“FFF0”這個樣子才對!哪裡出問題了呢?於是開始除錯。第一個迴圈就發現問題了:i=0,bin(i)得到的是‘0b0’,執行完lstrip('0b')之後s變成空了!趕緊查文件找原因。在文件中發現了這麼一句話:lstrip( [ chars ] )……The chars argument is not a prefix; rather, all combinations of its values are stripped,百度翻譯的結果是“chars引數不是字首;相反,它的**值的所有組合都被剝離**”。好吧,我一不小心掉進這個坑了!還是用切片吧,遠離lstrip這傢伙!
            於是改成了第2版:               

i = 0
while i < 65536:

s存放對應的二進位制數的str並去掉前導的'0b'

#s =  bin( i ).lstrip( '0b' ),千萬不要用lstrip,它會去掉0
#應該用切片[2:]來提取‘0b’後面的字串
s = bin ( i )[2:]
#如果s的長度不夠16位就在前面補0
while len( s ) < 16:
    s = '0' + s    
#將s的每4位轉換成一個大寫的十六進位制
h1 = hex( int( s[:4], 2 ))[2:].upper()
h2 = hex( int( s[4:8], 2 ))[2:].upper()
h3 = hex( int( s[8:12], 2 ))[2:].upper()
h4 = hex( int( s[12:16], 2 ))[2:].upper()
h =  h1 + h2 + h3 + h4
print( h )
i += 1

            試執行一下,挺好,結果看起來順眼多了!

(後記:後來知道有相應的管理工具:SolarWinds要錢,PHPIPAM、NIPAP免費功能也很強大。)