Làm thế nào để chuyển đổi một int thành một chuỗi hex?


210

Tôi muốn lấy một số nguyên (sẽ là <= 255), để biểu diễn chuỗi hex

ví dụ: Tôi muốn vượt qua 65và thoát ra '\x41', hoặc 255nhận được '\xff'.

Tôi đã thử làm điều này với struct.pack('c',65 ), nhưng nó bóp nghẹt bất cứ thứ gì ở trên 9vì nó muốn nhận một chuỗi ký tự duy nhất.

Câu trả lời:


214

Bạn đang tìm kiếm chrchức năng.

Dường như bạn đang trộn các biểu diễn thập phân của số nguyên và biểu diễn hex của số nguyên, vì vậy nó không hoàn toàn rõ ràng những gì bạn cần. Dựa trên mô tả bạn đã đưa ra, tôi nghĩ một trong những đoạn này cho thấy những gì bạn muốn.

>>> chr(0x65) == '\x65'
True


>>> hex(65)
'0x41'
>>> chr(65) == '\x41'
True

Lưu ý rằng điều này khá khác với một chuỗi chứa một số nguyên dưới dạng hex . Nếu đó là những gì bạn muốn, hãy sử dụng hexnội dung.


2
Tôi nghĩ chr chuyển đổi số nguyên sang ascii. Trong trường hợp đó chr (65) = 'A'. Đây có phải là một bổ sung mới?
deaththreetimes

2
@diedthreetimes, chrhoàn toàn không liên quan đến ASCII - nó chỉ đơn giản là lấy một số và tạo ra một giá trị một byte trong đó giá trị thứ tự của byte là số. Các bảng mã tương thích ASCII và ASCII phát huy tác dụng khi bạn viết và hiển thị các chuỗi phụ.
Mike Graham

1
@diedthreetimes, Ví dụ, họ đến bằng cách thực hiện 'A'một cách khác để viết và hiển thị '\x41'. Tất cả strthực sự quan tâm là thực tế đây là sáu mươi lăm. Để làm cho mọi thứ trở nên dễ hiểu và có thể sử dụng được bởi con người, nó thường trở thành A.
Mike Graham

134

Điều này sẽ chuyển đổi một số nguyên thành chuỗi hex 2 chữ số với tiền tố 0x:

strHex = "0x%0.2X" % 255

2
Tôi đề nghị chỉnh sửa mã ở đây và thay đổi nó thành mã này: strHex = "0x% 0.2X"% integVariable. (Tôi không thể tự chỉnh sửa.)
Samuel

57

Thế còn hex()?

hex(255)  # 0xff

Nếu bạn thực sự muốn có \ở phía trước, bạn có thể làm:

print '\\' + hex(255)[1:]

repr(chr(255)) # '\xff'cũng đạt được điều này
Glenn 'devalias'


31

Hãy để tôi thêm cái này, bởi vì đôi khi bạn chỉ muốn biểu diễn một chữ số:

'{:x}'.format(15)
> f

Và bây giờ với f''chuỗi định dạng mới, bạn có thể làm:

f'{15:x}'
> f

LƯU Ý: 'f' ban đầu f'{15:x}'là để biểu thị một chuỗi định dạng


Để tham khảo về tính năng gọn gàng này, PEP 498 - Nội suy chuỗi ký tự
MFT

1
IMHO, tùy chọn "dễ đọc" hơn một chút có thể là '0x {: X}'. Định dạng (15) (chú ý X là chữ hoa). Vào năm 2034, nó sẽ in 0x7F2 thay vì 7f2
Pavel Sapehin

11

Nếu bạn muốn đóng gói một cấu trúc có giá trị <255 (một byte không dấu, uint8_t) và kết thúc bằng một chuỗi gồm một ký tự, có lẽ bạn đang tìm định dạng B thay vì c . C chuyển đổi một ký tự thành một chuỗi (không quá hữu ích) trong khi B chuyển đổi một số nguyên.

struct.pack('B', 65)

(Và vâng, 65 là \ x41, không phải \ x65.)

Lớp struct cũng sẽ thuận tiện xử lý endianness cho giao tiếp hoặc sử dụng khác.


Lượng thời gian tôi đã tìm thấy struct.pack ('B', <số nguyên>) là đáng kinh ngạc. Cảm ơn bạn.
Sean D.

7

Lưu ý rằng đối với các giá trị lớn, hex()vẫn hoạt động (một số câu trả lời khác không):

x = hex(349593196107334030177678842158399357)
print(x)

Python 2: 0x4354467b746f6f5f736d616c6c3f7dL
Python 3:0x4354467b746f6f5f736d616c6c3f7d

Đối với một thông điệp RSA được giải mã, người ta có thể làm như sau:

import binascii

hexadecimals = hex(349593196107334030177678842158399357)

print(binascii.unhexlify(hexadecimals[2:-1])) # python 2
print(binascii.unhexlify(hexadecimals[2:])) # python 3

5

Điều này làm việc tốt nhất cho tôi

"0x%02X" % 5  # => 0x05
"0x%02X" % 17 # => 0x11

Thay đổi (2) nếu bạn muốn một số có chiều rộng lớn hơn (2 là cho 2 ký tự in hex) vì vậy 3 sẽ cung cấp cho bạn những điều sau đây

"0x%03X" % 5  # => 0x005
"0x%03X" % 17 # => 0x011

3

Tôi muốn một số nguyên ngẫu nhiên được chuyển đổi thành một chuỗi hex sáu chữ số có dấu # ở đầu. Để có được điều này tôi đã sử dụng

"#%6x" % random.randint(0xFFFFFF)

6
Tôi cho rằng bạn có nghĩa là "#%6x" % random.randint(0x0, 0xFFFFFF). (Có một thiếu %trước 6randintmất 2 tham số -lower và giới hạn trên-)
pacha

5
nên là% 06x nếu bạn không muốn có khoảng trắng
Janus Troelsen

3

Với format(), theo ví dụ định dạng , chúng ta có thể làm:

>>> # format also supports binary numbers
>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'

2
(int_variable).to_bytes(bytes_length, byteorder='big'|'little').hex()

Ví dụ:

>>> (434).to_bytes(4, byteorder='big').hex()
'000001b2'
>>> (434).to_bytes(4, byteorder='little').hex()
'b2010000'

1

Ngoài ra, bạn có thể chuyển đổi bất kỳ số nào trong bất kỳ cơ sở sang hex. Sử dụng mã một dòng này ở đây thật dễ dàng và đơn giản để sử dụng:

hex(int(n,x)).replace("0x","")

Bạn có một chuỗi nlà số của bạn và x cơ sở của số đó. Đầu tiên, thay đổi nó thành số nguyên và sau đó thành hex nhưng hex có 0xở đầu tiên vì vậy replacechúng tôi loại bỏ nó.


-1

Là một đại diện thay thế, bạn có thể sử dụng

[in] '%s' % hex(15)
[out]'0xf'
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.