Chuyển đổi chuỗi hex thành int trong Python


765

Làm cách nào để chuyển đổi một chuỗi hex thành int trong Python?

Tôi có thể có nó là " 0xffff" hoặc chỉ " ffff".

Câu trả lời:


1086

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 0là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.)


25
Có nghĩa là bạn nên luôn luôn sử dụng 16 làm đối số thứ hai. Rõ ràng là tốt hơn so với ngầm.
Bachsau

13
@bachsau, rõ ràng không đúng sự thật. Điều gì nếu bạn muốn đọc đầu vào của người dùng, cho phép đầu vào ở dạng hex hoặc thập phân, tùy theo cái nào thuận tiện cho người dùng?
Dan Lenski

7
Ok, tôi nên nói: Trong trường hợp cụ thể này! Câu hỏi ban đầu là "Làm cách nào để chuyển đổi một chuỗi hex hex". Nếu bạn muốn để lại cho người dùng, thì đó là một tính năng hữu ích, với điều đó bạn đã đúng.
Bachsau

@DanLenski, nó luôn chuyển đổi các chuỗi hex thành số dương. Tôi muốn int("FFFF",16)được chuyển đổi thành -1.
Nazar

@Nazar đã có từ lâu, vì vậy điều này có thể không hữu ích cho bạn tại thời điểm này, nhưng đối với bất kỳ ai khác vấp ngã ở đây, nếu áp dụng quy tắc bổ sung của hai là bắt buộc. Câu trả lời này có thể giúp stackoverflow.com/questions/1604464/twos-compuity-in-python
Jeremy

163

int(hexString, 16) thực hiện thủ thuật và hoạt động có và không có tiền tố 0x:

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


43

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 intcù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

Để intsuy luận

Nếu bạn vượt qua 0 làm cơ sở, intsẽ 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, intsẽ 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'

nghĩa đen

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 ffffvì 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ố.


Đáng lặp lại "Cho phép int suy ra Nếu bạn vượt qua 0 làm cơ sở, int sẽ suy ra cơ sở từ tiền tố trong chuỗi." Làm thế nào để chuyển đổi từ thập lục phân hoặc thập phân (hoặc nhị phân) sang số nguyên như trình thông dịch python.
gaoithe

13

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

5

Cách tồi tệ nhất:

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

>>> hex_to_int("c0ffee")
12648430

Xin đừng làm điều này!

Là sử dụng eval trong Python là một thực hành xấu?


3
Điều đáng chú ý evallà nó cũng chậm một cách vô lý, trên hết các vấn đề khác với nó.
j6m8

4
Nếu đây là một ý tưởng tồi, vậy thì điểm quan trọng của nó là gì?
pppery

3
Điểm tốt. Một phần vì tôi nghĩ nó buồn cười và một phần vì tôi đã thấy nó trong mã sản xuất.
André Laszlo

Tôi có lẽ nên lưu ý rằng tôi đã từng làm điều này sau khi gặp sự cố với việc 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.
Tcll

1
tôi thấy điều này thật hài hước và giác ngộ, tôi rất vui vì nó đã được đăng
frogeyedpeas

3

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
>>> 

1

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

Các ý kiến ​​không chính xác. print(b)sẽ đầu ra 256, không 100print(c)sẽ đầu ra 100, không 256. Cũng lưu ý rằng đó clà một chuỗi, nhưng akhô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ì).
André Laszlo

Cảm ơn cho đầu vào của bạn, tôi đồng ý rằng câu trả lời của tôi là không đúng, và bây giờ tôi đã sửa nó. Tuy nhiên tôi nhận ra rằng một phần của câu trả lời là thừa như trên tức là sử dụng int (chuỗi, cơ sở), nhưng phần còn lại của câu trả lời thêm nhiều tùy chọn cho bài đăng, tôi tin. Đồng ý ?
Soundararajan

Không liên quan; đây là về việc chuyển đổi từ cơ sở 16 sang cơ sở 10, không phải theo cách khác
pppery

1

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

1

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)

-1

Trong Python 2.7, int('deadbeef',10)dường như không hoạt động.

Các công việc sau đây cho tôi:

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

4
Làm thế nào để trả lời câu hỏi này?
pppery

-5

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

16
Đảm bảo xác thực đầu vào được thực hiện chính xác nếu sử dụng eval. Trong thực tế, có lẽ có một cách tốt hơn. Đừng dùng eval.
ALOToverflow

7
Ít nhất bạn nên sử dụng ast.literal_eval.
Andy Hayden

2
Cũng rất chậm. Cách tồi tệ nhất
Tõnu Samuel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.