2009-03-02 21 views
31

「0x」で始まる16進数またはマイナス記号以外の特別な接頭辞を持たない10進数の文字列を使用しています。 "0x123"はベース16にあり、 "-298"はベース10にあります。Pythonで16進数または16進整数を解析する方法

これをPythonのintまたはlongに変換するにはどうすればよいですか?

私はeval()を使いたくないのですが、それは危険で危険なので、このような

+0

なぜevalが安全でないのですか?邪悪な人たちがコードをそれらの番号に盗んでしまいますか?誰がそれらの文字列にアクセスできますか?彼らは信頼できませんか? –

+9

evalは任意のコードを実行できるので安全ではありません。あなたが信頼できるソースから文字列を取得している場合、それはまだ安全ではありません。ただ、この信頼できるソースに頼ってそれを利用していないことが起こります。あなたがいつもストリングをコントロールしていたら、それはなぜストリングですか? –

+0

あなたのpythonプログラムはソース形式で利用できます - それはまた "任意のコード"です。なぜPythonソースと他のソースの間に線を引くのでしょうか? EvalはPythonプログラムを最初に実行するより安全です。 –

答えて

52
int("0x123", 0) 

(なぜint("0x123")はそれをしない?)

+9

これは、intがPythonで実装される方法と同じです。0を基数として渡すことで明示的に指示しない限り、10進数を前提としています。 –

+2

いいえ、先行ゼロはデフォルトでoctにしません。 'int(" 010 ")'は '10'を返します。 –

+0

しかし、Pythonは先行するゼロを持つ8進数を表さないので、接頭辞として '0o'(例えば' 0o10')を持つべきです。それでも、最も一般的なユースケースは10進数から変換することです。これがデフォルトの動作です。 –

5

何かがあなたが探しているものかもしれません。

def convert(aString): 
    if aString.startswith("0x") or aString.startswith("0X"): 
     return int(aString,16) 
    elif aString.startswith("0"): 
     return int(aString,8) 
    else: 
     return int(aString) 
+0

もし 'if aString.upper()。startswith( '0X')を使用しないのはなぜですか?もちろん 'lower()'と '' 0x ''も使えます。 – a2j

+0

@ a2j:大きな理由はありません。しかし、あなたができることは、トレードオフが何であるかを把握するために 'timeit'を使うことです。 –

25

10のベース16(整数を返す):

>>> int('0x123', 16) 
291 

ベース10〜16(文字列を返す):

>>> hex(291) 
'0x123' 
-2

これはのように機能簡単なバージョンでありますチャーム。

def itoh(int): return hex(int)[2:] 
+1

OPは文字列をintに変換しようとしています。あなたのコードは別の方法です。 –

+0

パラメータの名前としてpythonキーワードを使用したときのように、最小限に抑える –

0

あなたは別の番号システムとの間に行くの多くを行っている場合は、ビット列ライブラリはバイナリ/六角操作の多くは、簡単にする:六角以来 戻り値文字列は()と同じ型を返します。

http://pythonhosted.org/bitstring/