Câu trả lời:
Nếu không có tiền tố 0x, bạn cần xác định rõ ràng cơ sở, nếu không thì không có cách nào để nói:
x = int("deadbeef", 16)
Với tiền tố 0x, Python có thể tự động phân biệt hex và thập phân.
>>> print int("0xdeadbeef", 0)
3735928559
>>> print int("10", 0)
10
(Bạn phải chỉ định 0
làm cơ sở để gọi hành vi đoán tiền tố này; bỏ qua tham số thứ hai có nghĩa là giả sử cơ sở-10.)
int("FFFF",16)
được chuyển đổi thành -1.
Đối với bất kỳ chuỗi đã cho s:
int(s, 16)
Chuyển đổi chuỗi hex thành int trong Python
Tôi có thể có nó như
"0xffff"
hoặc chỉ"ffff"
.
Để chuyển đổi một chuỗi thành một int, hãy chuyển chuỗi đến int
cùng với cơ sở bạn đang chuyển đổi từ đó.
Cả hai chuỗi sẽ đủ để chuyển đổi theo cách này:
>>> string_1 = "0xffff"
>>> string_2 = "ffff"
>>> int(string_1, 16)
65535
>>> int(string_2, 16)
65535
int
suy luậnNếu bạn vượt qua 0 làm cơ sở, int
sẽ suy ra cơ sở từ tiền tố trong chuỗi.
>>> int(string_1, 0)
65535
Không có tiền tố thập lục phân 0x
, int
sẽ không có đủ thông tin để đoán:
>>> int(string_2, 0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 0: 'ffff'
Nếu bạn đang nhập mã nguồn hoặc trình thông dịch, Python sẽ thực hiện chuyển đổi cho bạn:
>>> integer = 0xffff
>>> integer
65535
Điều này sẽ không hoạt động với ffff
vì Python sẽ nghĩ rằng bạn đang cố gắng viết một tên Python hợp pháp thay thế:
>>> integer = ffff
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'ffff' is not defined
Số Python bắt đầu bằng một ký tự số, trong khi tên Python không thể bắt đầu bằng ký tự số.
Thêm vào câu trả lời của Dan ở trên: nếu bạn cung cấp hàm int () bằng một chuỗi hex, bạn sẽ phải chỉ định cơ sở là 16 hoặc nó sẽ không nghĩ rằng bạn đã cho nó một giá trị hợp lệ. Chỉ định cơ sở 16 là không cần thiết cho các số hex không có trong chuỗi.
print int(0xdeadbeef) # valid
myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid
Cách tồi tệ nhất:
>>> def hex_to_int(x):
return eval("0x" + x)
>>> hex_to_int("c0ffee")
12648430
eval
là nó cũng chậm một cách vô lý, trên hết các vấn đề khác với nó.
int(s,16)
trả về các giá trị không phù hợp, gây ra một số vấn đề lớn với thời gian chạy của tôi ( int(hex(value),16) == int(value) >>> False
). chuỗi cung cấp cho eval()
là an toàn và giá trị trả về là đúng.
Hoặc ast.literal_eval
(điều này là an toàn, không giống như eval
):
ast.literal_eval("0xffff")
Bản giới thiệu:
>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>>
Tùy chọn định dạng '% x'% dường như cũng hoạt động trong các câu lệnh gán. (Giả sử Python 3.0 trở lên)
Thí dụ
a = int('0x100', 16)
print(a) #256
print('%x' % a) #100
b = a
print(b) #256
c = '%x' % a
print(c) #100
print(b)
sẽ đầu ra 256
, không 100
và print(c)
sẽ đầu ra 100
, không 256
. Cũng lưu ý rằng đó c
là một chuỗi, nhưng a
không phải vì vậy câu trả lời của bạn thực sự chuyển đổi một int thành một chuỗi chứ không phải theo cách khác (đây là câu hỏi về vấn đề gì).
Nếu bạn đang sử dụng trình thông dịch python, bạn chỉ cần nhập 0x (giá trị hex) và trình thông dịch sẽ tự động chuyển đổi nó cho bạn.
>>> 0xffff
65535
Xử lý hex, bát phân, nhị phân, int và float
Sử dụng các tiền tố tiêu chuẩn (tức là 0x, 0b, 0 và 0o), hàm này sẽ chuyển đổi bất kỳ chuỗi phù hợp nào thành một số. Tôi đã trả lời điều này tại đây: https://stackoverflow.com/a/58997070/2464381 nhưng đây là chức năng cần thiết.
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)
với tiền tố '0x', bạn cũng có thể sử dụng hàm eval
Ví dụ
>>a='0xff'
>>eval(a)
255
ast.literal_eval
.