ฉันจะแปลงสตริง hex เป็น int ใน Python ได้อย่างไร
ฉันอาจจะเป็น " 0xffff
" หรือเพียงแค่ " ffff
"
ฉันจะแปลงสตริง hex เป็น int ใน Python ได้อย่างไร
ฉันอาจจะเป็น " 0xffff
" หรือเพียงแค่ " ffff
"
คำตอบ:
หากไม่มีส่วนนำหน้า 0x คุณต้องระบุฐานอย่างชัดเจนมิฉะนั้นจะไม่มีวิธีที่จะบอกได้:
x = int("deadbeef", 16)
ด้วยคำนำหน้า 0x Python สามารถแยกความแตกต่างของฐานสิบหกและทศนิยมโดยอัตโนมัติ
>>> print int("0xdeadbeef", 0)
3735928559
>>> print int("10", 0)
10
(คุณต้องระบุ0
เป็นฐานในการเรียกใช้พฤติกรรมการคาดเดาคำนำหน้านี้การละเว้นพารามิเตอร์ที่สองหมายถึงการถือว่าฐาน -10)
int("FFFF",16)
แปลงเป็น -1
int(hexString, 16)
หลอกลวงและทำงานร่วมกับและไม่มีส่วนนำหน้า 0x:
>>> int("a", 16)
10
>>> int("0xa",16)
10
สำหรับสตริงที่กำหนด s:
int(s, 16)
แปลงสตริง 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 ไม่สามารถเริ่มต้นด้วยอักขระตัวเลขได้
การเพิ่มคำตอบของ Dan ด้านบน: หากคุณจัดหาฟังก์ชัน int () ด้วยสตริงฐานสิบหกคุณจะต้องระบุฐานเป็น 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
eval
มันช้าอย่างไร้สาระด้วยประเด็นอื่น ๆ ที่เกี่ยวข้อง
int(s,16)
คืนค่าที่ไม่เหมาะสมทำให้เกิดปัญหาที่สำคัญบางอย่างกับรันไทม์ของฉัน ( int(hex(value),16) == int(value) >>> False
) สตริงที่จัดหาให้eval()
นั้นปลอดภัยและค่าที่ส่งคืนนั้นเหมาะสม
หรือast.literal_eval
(ปลอดภัยไม่เหมือนeval
):
ast.literal_eval("0xffff")
การสาธิต:
>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>>
ตัวเลือกการจัดรูปแบบ '% 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 เป็นสตริงไม่ใช่วิธีอื่น ๆ (นี่คือคำถามที่เกี่ยวกับ)
หากคุณใช้ล่ามหลามคุณสามารถพิมพ์ 0x (ค่าฐานสิบหกของคุณ) แล้วล่ามจะแปลงมันให้คุณโดยอัตโนมัติ
>>> 0xffff
65535
จัดการเลขฐานสิบหกฐานแปด 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)
ใน Python 2.7 int('deadbeef',10)
ดูเหมือนจะไม่ทำงาน
งานต่อไปนี้สำหรับฉัน:
>>a = int('deadbeef',16)
>>float(a)
3735928559.0
ด้วยคำนำหน้า '0x' คุณอาจใช้ฟังก์ชัน eval
ตัวอย่างเช่น
>>a='0xff'
>>eval(a)
255
ast.literal_eval
คุณควรจะใช้