2011-12-07 50 views
0

我製作MAC地址生成器,目前我有這個問題。如何定義兩個零的變量

mac1="001122334455" 
mac2="001122334695" 

mac1 = [mac1[x:x+2] for x in xrange(0,len(mac1),2)] 
mac2 = [mac2[x:x+2] for x in xrange(0,len(mac2),2)] 
k=0 
for item in mac1: 
    mac1[k] = "%d" % int(mac1[k], 16) 
    mac2[k] = "%d" % int(mac2[k], 16) 
    mac1[k]=int(mac1[k]) 
    mac2[k]=int(mac2[k]) 
    k=k+1 

while mac1 != mac2: 
    #print mac1 

    print "%X0:%X:%X:%X:%X:%X" % (mac1[0], mac1[1], mac1[2], mac1[3], mac1[4], mac1[5]) 
    mac1[5] = int(mac1[5]) + 1 
    if int(mac1[5]) > 255: 
     #mac1[5] = 00 
     mac1[4] = int(mac1[4]) +1 
     if int(mac1[4]) > 255: 
      mac1[3] = int(mac1[3]) + 1 
      if int(mac1[3]) > 255: 
       mac1[2] = int(mac1[2]) +1 
       if int(mac1[2]) > 255: 
        mac1[1] = int(mac1[1]) +1 

我需要開始從開始產生第五字節,所以我定義MAC1 [5] = 00,但代替兩個0我只得到一個0?

+0

替換'「%X0:%X:%X:%X:%X:% X「''%02X:%02X:%02X:%02X:%02X:%02X」' - 但看到我的解決方案稍微短一些。 – eumiro

+0

您的解決方案工作,謝謝:) – Thomas

+0

採取字符串切片比做一堆班次和mods更容易 - 請參閱下面的解決方案。 – Dave

回答

0

簡單多了,只是把整個MAC作爲一個數字:

mac1 = 0x1122334455 
mac2 = 0x1122334695 
for i in xrange(mac1, mac2+1): 
    s = "%012x" % i 
    print ':'.join(s[j:j+2] for j in range(0,12,2))) 

Display number with leading zeros

0

你不能設置一個整數作爲00它總是降解爲0,加入到這一事實,在Python 2.x中把一個0在一個整數(例如0123)前會告訴蟒蛇你想評價這個數字一個octal!挑釁不是你想要的。在python 3.x中,0integer是完全不允許的!

如果您想要00而不是0,則需要使用字符串。

出於興趣,你是否試圖生成一個mac1mac2之間的mac範圍,如果是這樣的話,我懷疑我有一個更優雅的解決方案,如果你有興趣。


編輯:

工作液將打印起點和終點之間的MAC地址的十六進制值,因爲它與0 and 255之間的整數內部工作原理startend值是整數不是十六進制值。

start = [0,11,22,33,44,55] 
end = [0,11,22,33,46,95] 

def generate_range(start, end): 
    cur = start 

    while cur < end:  
     cur[5] = int(cur[5]) + 1 

     for pos in range(len(cur)-1, -1, -1): 
      if cur[pos] == 255: 
       cur[pos] = 0 
       cur[pos-1] = int(cur[pos-1]) + 1 

     yield ':'.join("{0:02X}".format(cur[i]) for i in range(0,len(cur))) 

for x in generate_range(start, end): 
    print (x) 
+0

是的,我試圖做到這一點。任何信息如何做到這一點更優雅會很好。 – Thomas

+0

我注意到你在比較'255',但你有2個職位,我假設你也使用十六進制數字? – Serdalis

+0

是的,我正在使用十六進制。 – Thomas