Pythonで16進数文字列をintに変換する


766

Pythonで16進数文字列をintに変換するにはどうすればよいですか?

" 0xffff"または単に " ffff" として持っているかもしれません。

回答:


1087

せずに 0xをプレフィックス、あなたはそう言うする方法はありません、明示的にベースを指定する必要があります。

x = int("deadbeef", 16)

先頭に0x、Pythonは自動的に進小数を区別することができます。

>>> print int("0xdeadbeef", 0)
3735928559
>>> print int("10", 0)
10

(この接頭辞推測動作を呼び出すには、ベースとして指定する必要あります0。2番目のパラメーターを省略すると、base-10と見なされます。)


25
つまり、常に2番目の引数として16を使用する必要があります。明示的は暗黙的よりも優れています。
バクサウ2018年

13
@bachsau、明らかに正しくない。ユーザーの入力を読み取り、16進数または10進数で入力できるようにする場合、ユーザーにとって都合のよい方はどうでしょうか。
Dan Lenski 2018年

7
さて、私は言うべきでした:この特定のケースでは!元の質問は、「16進文字列を変換するにはどうすればよいですか?」でした。それをユーザーに任せたい場合、それは便利な機能であるというよりも、あなたが正しいと言えます。
バクサウ2018年

@DanLenski、それは常に16進文字列を正の数に変換します。int("FFFF",16)-1に換算したい。
Nazar

@Nazar久しぶりなので、現時点では役に立たないかもしれませんが、2つの補数規則を適用する必要がある場合は、ここでつまずく人にとっては役に立ちません。この回答は、stackoverflow.com
Jeremy

163

int(hexString, 16) トリックを行い、0xプレフィックスの有無にかかわらず動作します。

>>> int("a", 16)
10
>>> int("0xa",16)
10


43

Pythonで16進数文字列をintに変換する

私はそれとして持っていること"0xffff"またはちょうど"ffff"

文字列をintにint変換するには、変換元のベースとともに文字列をに渡します。

どちらの文字列も、この方法で変換するには十分です。

>>> string_1 = "0xffff"
>>> string_2 = "ffff"
>>> int(string_1, 16)
65535
>>> int(string_2, 16)
65535

まかせint推論

ベースとして0を渡すintと、文字列のプレフィックスからベースが推測されます。

>>> int(string_1, 0)
65535

進接頭辞がなければ、0xint推測するとの十分な情報を持っていません。

>>> int(string_2, 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 0: 'ffff'

リテラル:

ソースコードまたはインタープリターに入力する場合、Pythonが変換を行います。

>>> integer = 0xffff
>>> integer
65535

ffffPythonは代わりに正当なPython名を記述しようとしていると考えるため、これは機能しません。

>>> integer = ffff
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'ffff' is not defined

Python番号は数字で始まりますが、Python名は数字で始めることはできません。


「intの推測を基に0をベースとして渡すと、intは文字列のプレフィックスからベースを推測します」を繰り返す価値があります。Pythonインタープリターが行うように、16進数または10進数(または2進数)から整数に変換する方法。
gaoithe

13

上記のダンの答えに追加してください:int()関数に16進文字列を指定する場合、ベースを16として指定する必要があります。そうしないと、有効な値を指定したとは見なされません。文字列に含まれていない16進数には、基数16を指定する必要はありません。

print int(0xdeadbeef) # valid

myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid

5

最悪の方法:

>>> def hex_to_int(x):
    return eval("0x" + x)

>>> hex_to_int("c0ffee")
12648430

これを行わないでください!

Pythonでevalを使用することは悪い習慣ですか?


3
それevalが他のすべての問題に加えて、それが不条理に遅いことも注目に値します。
j6m8 2015年

4
これが悪い考えである場合、それを持ち出すことの意味は何ですか?
pppery 2017

3
いい視点ね。面白いと思う理由もあれば、プロダクションコードで見た理由もあります。
アンドレ・ラズロ

int(s,16)不適切な値を返すという問題が発生し、ランタイムにいくつかの主要な問題が発生した後にこれを行っていたことにおそらく注意する必要があります(int(hex(value),16) == int(value) >>> False)。提供された文字列eval()は安全で、返された値は適切でした。
Tcll

1
私はこれが面白いと啓発的であることがわかりました、それが投稿されてうれしいです
frogeyedpeas

3

またはast.literal_eval(これはとは異なり、安全ですeval):

ast.literal_eval("0xffff")

デモ:

>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>> 

1

フォーマッタオプション '%x'%は、割り当てステートメントでも機能するようです。(Python 3.0以降を想定)

a = int('0x100', 16)
print(a)   #256
print('%x' % a) #100
b = a
print(b) #256
c = '%x' % a
print(c) #100

コメントが間違っています。print(b)は出力256せず100print(c)出力100もしない256。またc、これaは文字列ですが、実際の答えはintを文字列に変換するのではなく、その逆ではありません(これが問題です)。
アンドレ・ラズロ

あなたの入力をありがとう、私は私の答えが正しくないことに同意し、今私はそれを修正しました。しかし、私は答えの一部が上記のように冗長であることを理解しています。同意しますか?
Soundararajan 2015

関係ありません; これは、ベース16からベース10への変換に関するものではなく、その逆ではありません
pppery

1

Pythonインタープリターを使用している場合は、0x(16進値)を入力するだけで、インタープリターが自動的に変換します。

>>> 0xffff

65535

1

16進数、8進数、2進数、int、floatを処理します

標準の接頭辞(0x、0b、0、および0o)を使用して、この関数は適切な文字列を数値に変換します。私はここでこれに答えました:https : //stackoverflow.com/a/58997070/2464381が、ここに必要な関数があります。

def to_number(n):
    ''' Convert any number representation to a number 
    This covers: float, decimal, hex, and octal numbers.
    '''

    try:
        return int(str(n), 0)
    except:
        try:
            # python 3 doesn't accept "010" as a valid octal.  You must use the
            # '0o' prefix
            return int('0o' + n, 0)
        except:
            return float(n)

-1

Python 2.7ではint('deadbeef',10)動作しないようです。

次は私のために働きます:

>>a = int('deadbeef',16)
>>float(a)
3735928559.0

4
これはどのように質問に答えますか?
pppery 2017

-5

'0x'プレフィックスを付けて、eval関数を使用することもできます

例えば

>>a='0xff'
>>eval(a)
255

16
evalを使用する場合は、入力の検証が正しく行われていることを確認してください。実際、おそらくもっと良い方法があります。evalを使用しないでください。
ALOToverflow 2013

7
非常に少なくとも、あなたが使用する必要がありますast.literal_eval
アンディヘイデン

2
また、非常に遅いです。最悪の方法。
トヌ・サミュエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.