سؤال

كيف يمكنني تحويل سلسلة سداسية عشرية إلى int في بايثون؟

قد يكون لدي مثل "0xffff" أو فقط "ffff".

هل كانت مفيدة؟

المحلول

بدون البادئة 0x، فأنت بحاجة إلى تحديد القاعدة بشكل صريح، وإلا فلن تكون هناك طريقة لمعرفة:

x = int("deadbeef", 16)

مع البادئة 0x، يمكن لبيثون التمييز بين العلامة السداسية والعشرية تلقائيًا.

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

(أنت يجب تحديد 0 كقاعدة لاستدعاء سلوك تخمين البادئة هذا؛إن حذف المعلمة الثانية يعني افتراض الأساس 10.)

نصائح أخرى

وint(hexString, 16) لا حيلة، ويعمل مع وبدون بادئة 0X:

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

لأي سلسلة الصورة الممنوحة:

int(s, 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

وبدون بادئة عشري، 0x، int ليس لديها ما يكفي من المعلومات التي لتخمين:

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

الحرفية:

إذا كنت تكتب في شفرة مصدر أو مترجم، سوف بيثون إجراء عملية التحويل بالنسبة لك:

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

وهذا لن ينجح مع ffff لبيثون سوف تعتقد أنك تحاول إرسال اسم بيثون الشرعي بدلا من ذلك:

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

وأرقام بيثون تبدأ بحرف رقمية، في حين لا يمكن أن تبدأ أسماء بيثون مع حرف رقمي.

وإضافة إلى الإجابة دان أعلاه: إذا قمت بتوفير وظيفة الباحث () مع سلسلة عرافة، سيكون لديك لتحديد قاعدة إلى 16 أو أنها لن تعتقد أنك أعطاه قيمة صالحة. تحديد قاعدة 16 غير ضرورية لأعداد عرافة غير وارد في سلاسل.

print int(0xdeadbeef) # valid

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

وأسوأ طريقة:

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

>>> hex_to_int("c0ffee")
12648430

الرجاء لا تفعل هذا!

تحليل

هل باستخدام وحدة التقييم في بيثون عادة سيئة؟

أو ast.literal_eval (وهذا آمن، بخلاف eval):

ast.literal_eval("0xffff")

العرض التوضيحي:

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

في بيثون 2.7، لا يبدو int('deadbeef',10) للعمل.

والأعمال التالية بالنسبة لي:

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

يبدو أن خيار المنسق '%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

إذا كنت تستخدم مترجم الثعبان، يمكنك فقط اكتب 0X (قيمة عرافة الخاص بك) ومترجم وتحويله تلقائيا بالنسبة لك.

>>> 0xffff

65535

ومع البادئة "0X"، قد أيضا استخدام وظيفة حدة التقييم

وعلى سبيل المثال

>>a='0xff'
>>eval(a)
255
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top