2011-03-07 11 views
5

最近Pythonでプログラミングを始めましたが、inet_notainet_atonがどのようにPythonで動作するかを理解するのに問題があります。 PHP/MySQLから来て、私はいつも長い変数としてデータベースにIPアドレスを格納してきました。また、mysqlのinet_ntoaメソッドは、長い変数をパラメータとして受け取り、IPのドット付き形式を返します。したがって、Pythonのバージョンは同様の仕組みで動作すると仮定しました。しかし、Pythonのinet_ntoaは32ビットのパックドバイナリ形式が必要です。だから、167772160の値として格納されているIPアドレスを持って、どのようにinet_ntoaメソッドで必要な32ビットのパックドバイナリ値(\x7f\x00\x00\x01のような)に変換できますか? Pythonでinet_ntoa関数をPythonで使用しています

どうもありがとう

答えて

13

3.3+(2.6および2.7のためのthis backport付き)、あなたは単にipaddressを使用することができます。

import ipaddress 
addr = str(ipaddress.ip_address(167772160)) 
assert addr == '10.0.0.0' 

また、手動で値

import socket,struct 
packed_value = struct.pack('!I', 167772160) 
addr = socket.inet_ntoa(packed_value) 
assert addr == '10.0.0.0' 
をパックすることができます

また、inet_ptonに興味があります。このスレッドに後半の追加として

+0

私は自分のプロジェクトにパジャマを使用しています。「StructErrorを発生させてください。」引数はi、I、l、L、q、Q、h、Hは整数でなければなりません。何も問題なく動作しているようですが、これに対処する方法はありますか? – tibi3384

+0

@ tibi3384おそらくあなたは数字の文字列を持っているからです。 'int'のように' struct.pack( '!I'、int(string_ip_number_variable) )) '。 – phihag

+0

あなたはそうだね、それを見つけたはずです!完璧に動作します。私はまだキャストが自動的に実行されていたPHPに慣れています:) – tibi3384

2
from struct import pack 

n = pack("!I", 167772160) 
0

:あなたは、Python 3.3以上を使用している場合、ipaddressモジュールを見て:それははるかに機能的socket同等以上です。

関連する問題