แปลงสตริง hex เป็น int ใน Python


764

ฉันจะแปลงสตริง hex เป็น int ใน Python ได้อย่างไร

ฉันอาจจะเป็น " 0xffff" หรือเพียงแค่ " ffff"

คำตอบ:


1086

หากไม่มีส่วนนำหน้า 0x คุณต้องระบุฐานอย่างชัดเจนมิฉะนั้นจะไม่มีวิธีที่จะบอกได้:

x = int("deadbeef", 16)

ด้วยคำนำหน้า 0x Python สามารถแยกความแตกต่างของฐานสิบหกและทศนิยมโดยอัตโนมัติ

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

(คุณต้องระบุ0เป็นฐานในการเรียกใช้พฤติกรรมการคาดเดาคำนำหน้านี้การละเว้นพารามิเตอร์ที่สองหมายถึงการถือว่าฐาน -10)


25
ซึ่งหมายความว่าคุณควรใช้ 16 เป็นอาร์กิวเมนต์ที่สองเสมอ ชัดเจนดีกว่าโดยปริยาย
Bachsau

13
@bachsau ไม่จริงอย่างชัดเจน ถ้าคุณต้องการอ่านอินพุตของผู้ใช้, อนุญาตให้ป้อนเป็นฐานสิบหกหรือทศนิยม, แล้วแต่ว่าผู้ใช้จะสะดวกอะไร?
Dan Lenski

7
ตกลงฉันควรได้กล่าวว่า: ในกรณีนี้โดยเฉพาะ! คำถามเดิมคือ "ฉันจะแปลงสตริง hex ได้อย่างไร ... " หากคุณต้องการปล่อยให้มันแก่ผู้ใช้มันเป็นคุณสมบัติที่มีประโยชน์โดยที่คุณพูดถูก
Bachsau

@DanLenski มันจะแปลงสตริงเลขฐานสิบหกให้เป็นจำนวนบวกเสมอ ฉันต้องการint("FFFF",16)แปลงเป็น -1
Nazar

@Nazar มันใช้เวลานานมากดังนั้นนี่จึงไม่มีประโยชน์สำหรับคุณในตอนนี้ แต่สำหรับคนอื่นที่มาที่นี่หากจำเป็นต้องใช้กฎประกอบทั้งสองอย่าง คำตอบนี้อาจช่วยstackoverflow.com/questions/1604464/twos-complement-in-python
Jeremy



43

แปลงสตริง hex เป็น int ใน Python

ฉันอาจจะเป็นหรือเพียงแค่"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'

ตัวอักษร:

หากคุณพิมพ์ลงในซอร์สโค้ดหรือล่าม Python จะทำการแปลงให้คุณ:

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

สิ่งนี้จะไม่ได้ผลffffเพราะ Python จะคิดว่าคุณกำลังพยายามเขียนชื่อ 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 จะอนุมานฐานจากคำนำหน้าในสตริง" วิธีการแปลงจากเลขฐานสิบหกหรือทศนิยม (หรือไบนารี) เป็นจำนวนเต็มเหมือนที่ล่ามไพ ธ อน
gaoithe

13

การเพิ่มคำตอบของ Dan ด้านบน: หากคุณจัดหาฟังก์ชัน int () ด้วยสตริงฐานสิบหกคุณจะต้องระบุฐานเป็น 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

โปรดอย่าทำเช่นนี้!

การใช้ eval ใน Python เป็นการปฏิบัติที่ไม่ดีหรือไม่?


3
เป็นที่น่าสังเกตว่าevalมันช้าอย่างไร้สาระด้วยประเด็นอื่น ๆ ที่เกี่ยวข้อง
j6m8

4
ถ้านี่เป็นความคิดที่ไม่ดีอะไรคือสิ่งที่ทำให้มันเกิดขึ้น?
pppery

3
จุดดี. ส่วนหนึ่งเพราะฉันคิดว่ามันตลกและบางส่วนเพราะฉันเห็นในรหัสการผลิต
André Laszlo

ฉันควรทราบว่าฉันเคยทำเช่นนี้หลังจากประสบปัญหากับการint(s,16)คืนค่าที่ไม่เหมาะสมทำให้เกิดปัญหาที่สำคัญบางอย่างกับรันไทม์ของฉัน ( int(hex(value),16) == int(value) >>> False) สตริงที่จัดหาให้eval()นั้นปลอดภัยและค่าที่ส่งคืนนั้นเหมาะสม
Tcll

1
ฉันพบว่ามันตลกและให้ความกระจ่างฉันดีใจที่มันถูกโพสต์
frogeyedpeas


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ไม่ได้100และprint(c)ส่งออกจะไม่100 256โปรดทราบด้วยว่านั่นcคือสตริง แต่aไม่ใช่เพื่อให้คำตอบของคุณแปลง int เป็นสตริงไม่ใช่วิธีอื่น ๆ (นี่คือคำถามที่เกี่ยวกับ)
André Laszlo

ขอบคุณสำหรับข้อมูลของคุณฉันยอมรับว่าคำตอบของฉันไม่ถูกต้องและตอนนี้ฉันได้แก้ไขแล้ว อย่างไรก็ตามฉันตระหนักว่าส่วนหนึ่งของคำตอบนั้นซ้ำซ้อนดังกล่าวข้างต้นคือการใช้ int (string, base) แต่ยังคงคำตอบที่เหลือเพิ่มตัวเลือกเพิ่มเติมในการโพสต์ผมเชื่อว่า ตกลง ?
Soundararajan

ไม่เกี่ยวข้อง นี่เป็นเรื่องเกี่ยวกับการแปลงจากฐาน 16 เป็นฐาน 10 ไม่ใช่วิธีอื่น ๆ
pppery

1

หากคุณใช้ล่ามหลามคุณสามารถพิมพ์ 0x (ค่าฐานสิบหกของคุณ) แล้วล่ามจะแปลงมันให้คุณโดยอัตโนมัติ

>>> 0xffff

65535

1

จัดการเลขฐานสิบหกฐานแปด int และลอย

การใช้ส่วนนำหน้ามาตรฐาน (เช่น 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

-5

ด้วยคำนำหน้า '0x' คุณอาจใช้ฟังก์ชัน eval

ตัวอย่างเช่น

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

16
ตรวจสอบให้แน่ใจว่าการตรวจสอบอินพุตนั้นทำได้อย่างถูกต้องหากใช้ eval ในความเป็นจริงอาจมีวิธีที่ดีกว่า อย่าใช้ eval
ALOToverflow

7
ที่มากอย่างน้อยast.literal_evalคุณควรจะใช้
Andy Hayden

2
ยังช้ามาก ทางที่แย่ที่สุดที่เคยมีมา
Tõnuซามูเอล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.