2011-02-06 12 views
3

私は組み込みのネットワークアプライアンス(Linuxベース)の構築に取り組んでおり、デーモンconfファイルを動的に構築する必要性を抱いています。そのため、私は、confファイルを構築するpythonコードでネットワークアドレス計算を行う必要があります。私はプログラマーではないので、アプライアンスが出荷を開始すると期待していたように、機能しなくなるモジュールを書いたことに恐れています。Pythonネットワーク/ cidr計算

以下は、これまで私がこのサイトとGoogleで見つけたものと実際に結びついたものです。

ネットワークインターフェイスのネットワークアドレスとcidrを見つけるより良い方法はありますか?ネットマスクをbin strに変換し、1を数えていくのはかなり控えめです。

import socket 
import fcntl 
import struct 

SIOCGIFNETMASK = 0x891b 
SIOCGIFADDR = 0x8915 

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

def _GetIfaceMask(iface): 
    return struct.unpack('L', fcntl.ioctl(s, SIOCGIFNETMASK, struct.pack('256s', iface))[20:24])[0] 

def _GetIfaceAddr(iface): 
    return struct.unpack('L', fcntl.ioctl(s, SIOCGIFADDR, struct.pack('256s', iface[:15]))[20:24])[0] 

def GetIfaceNet(iface): 
    net_addr = _GetIfaceAddr(iface) & _GetIfaceMask(iface) 
    return socket.inet_ntoa(struct.pack('L', net_addr)) 

def GetIfaceCidr(iface): 
    bin_str = bin(_GetIfaceMask(iface))[2:] 
    cidr = 0 
    for c in bin_str: 
     if c == '1': cidr += 1 
    return cidr 

入力していただきありがとうございます。これは本当にやや失われています。これがこのタイプのフィードバックの場所でない場合は、私にお知らせください。

+1

あなたは 'netaddr'または' ipaddr'モジュールを試してみましたか? – jfs

+1

ああ!私は誰かがこれを既に済まされているに違いないと考えました - ありがとうございます@セバスチャン – tMC

答えて

2

あなたはそれが点線のIPフォーマットに長いから変換し、その逆も可能Pythonモジュールhttp://code.google.com/p/python-iptools/をiptools確認することがあります。

4

これは、ハミングウェイトアルゴリズムを使用して解くことができます。 How to count the number of set bits in a 32-bit integer?から盗まれたとPythonに翻訳:

def number_of_set_bits(x): 
    x -= (x >> 1) & 0x55555555 
    x = ((x >> 2) & 0x33333333) + (x & 0x33333333) 
    x = ((x >> 4) + x) & 0x0f0f0f0f 
    x += x >> 8 
    x += x >> 16 
    return x & 0x0000003f 

別の、より読みやすいソリューション(しかしO(log x)で実行されている):

def number_of_set_bits(x): 
    n = 0 
    while x: 
     n += x & 1 
     x = x >> 1 
    return n 
+0

O(log(x))、と思います。あなたは、x自身ではなく、xのビット数をループしています。 – DSM