วิธีการแปลง int เป็นสตริงฐานสิบหก?


210

ฉันต้องการใช้จำนวนเต็ม (นั่นคือ <= 255) ไปยังการแสดงสตริงฐานสิบหก

เช่นผมต้องการที่จะผ่านใน65และได้รับการออก'\x41'หรือและได้รับ255'\xff'

ฉันได้ลองทำสิ่งนี้กับstruct.pack('c',65 )แล้ว แต่สิ่งนี้ฉายาในสิ่งที่กล่าวมาข้างต้น9เนื่องจากมันต้องการที่จะใช้สายอักขระตัวเดียว

คำตอบ:


214

คุณกำลังมองหาchrฟังก์ชั่น

ดูเหมือนว่าคุณจะผสมการแทนทศนิยมของจำนวนเต็มและการแทนฐานสิบของจำนวนเต็มดังนั้นจึงไม่ชัดเจนว่าคุณต้องการอะไร จากคำอธิบายที่คุณให้มาฉันคิดว่าหนึ่งในตัวอย่างเหล่านี้แสดงสิ่งที่คุณต้องการ

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


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

โปรดทราบว่านี้ค่อนข้างแตกต่างจากสตริงที่มีจำนวนเต็มเป็นฐานสิบหก หากนั่นคือสิ่งที่คุณต้องการใช้hexบิวด์อิน


2
ฉันคิดว่า chr แปลงจำนวนเต็มเป็น ascii ในกรณีนี้ chr (65) = 'A' นี่เป็นส่วนเสริมใหม่หรือไม่
เสียชีวิตตั้งแต่

2
@diedthreetimes chrไม่เกี่ยวข้องกับ ASCII เลย - เพียงแค่ใช้ตัวเลขและทำการ bytestring หนึ่งไบต์โดยที่ค่าลำดับของไบต์เป็นตัวเลข การเข้ารหัสที่เข้ากันได้กับ ASCII และ ASCII จะเข้ามาเล่นเมื่อคุณเขียนและแสดงผลการทดสอบ
Mike Graham

1
@diedthreetimes ตัวอย่างเช่นพวกเขาเข้ามาโดยการ'A'เขียนและแสดง'\x41'วิธีอื่น สิ่งที่ทุกstrคนใส่ใจคือความจริงที่ว่านี่คือหกสิบห้า เพื่อให้มนุษย์สามารถเข้าใจและใช้งานได้บ่อยครั้งมันจึงกลายเป็นเอ
ไมค์เกรแฮม

134

นี้จะแปลงจำนวนเต็มเป็นสตริงเลขฐานสิบหก 2 หลักด้วยคำนำหน้า 0x:

strHex = "0x%0.2X" % 255

2
ฉันขอแนะนำให้แก้ไขรหัสที่นี่และเปลี่ยนเป็น: strHex = "0x% 0.2X"% integerVariable (ฉันแก้ไขตัวเองไม่ได้)
ซามูเอล



31

ให้ฉันเพิ่มอันนี้เพราะบางครั้งคุณแค่ต้องการการแทนหลักเดียว:

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

และตอนนี้ด้วยf''สตริงรูปแบบใหม่ที่คุณสามารถทำได้:

f'{15:x}'
> f

หมายเหตุ: ตัวอักษร "f" เริ่มต้นf'{15:x}'คือการสื่อความหมายของสตริงรูปแบบ


สำหรับการอ้างอิงเกี่ยวกับคุณสมบัติเรียบร้อยนี้ PEP 498 - การแก้ไขสตริงตัวอักษร
MFT

1
IMHO ตัวเลือก "อ่านได้" อีกเล็กน้อยสามารถเป็น '0x {: X}' รูปแบบ (15) (สังเกตุ X เป็นตัวพิมพ์ใหญ่) ในปี 2034 จะพิมพ์ 0x7F2 แทน 7f2
Pavel Sapehin

11

หากคุณต้องการที่จะแพ็ค struct มีมูลค่า <255 (หนึ่งไบต์ที่ไม่ได้ลงชื่อ uint8_t) และจบลงด้วยสตริงของตัวละครตัวหนึ่งที่คุณอาจกำลังมองหารูปแบบ B แทนค C แปลงอักขระเป็นสตริง (ไม่มีประโยชน์ด้วยตัวเอง) ในขณะที่ B แปลงจำนวนเต็ม

struct.pack('B', 65)

(และใช่ 65 คือ \ x41 ไม่ใช่ \ x65)

คลาส struct จะจัดการกับ endianness เพื่อการสื่อสารหรือการใช้งานอื่น ๆ อย่างสะดวก


ระยะเวลาที่ฉันต้องไปหา struct.pack ('B', <integer>) กำลังส่าย ขอบคุณ.
Sean D.

7

โปรดทราบว่าสำหรับค่าขนาดใหญ่hex()ยังคงใช้ได้

x = hex(349593196107334030177678842158399357)
print(x)

Python 2: 0x4354467b746f6f5f736d616c6c3f7dL
Python 3:0x4354467b746f6f5f736d616c6c3f7d

สำหรับข้อความ RSA ที่ถอดรหัสแล้วเราสามารถทำสิ่งต่อไปนี้ได้:

import binascii

hexadecimals = hex(349593196107334030177678842158399357)

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

5

สิ่งนี้ใช้ได้ผลดีที่สุดสำหรับฉัน

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

เปลี่ยน (2) หากคุณต้องการตัวเลขที่มีความกว้างมากกว่า (2 สำหรับ 2 ตัวอักษรที่พิมพ์ด้วยฐานสิบหก) ดังนั้น 3 จะให้สิ่งต่อไปนี้แก่คุณ

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

3

ฉันต้องการจำนวนเต็มแบบสุ่มที่แปลงเป็นสตริงเลขฐานสิบหกหกหลักด้วย # ที่จุดเริ่มต้น เพื่อให้ได้สิ่งนี้ฉันใช้

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

6
"#%6x" % random.randint(0x0, 0xFFFFFF)ฉันคิดว่าคุณหมายถึง (นอกจากนี้ที่หายไป%ก่อน6และrandintใช้เวลา 2 พารามิเตอร์ -lower และ bounds- บน)
นายพล

5
ควรเป็น% 06x หากคุณไม่ต้องการเว้นวรรค
Janus Troelsen



1

นอกจากนี้คุณสามารถแปลงตัวเลขใด ๆ ในฐานใด ๆ ให้เป็นเลขฐานสิบหก ใช้รหัสบรรทัดนี้นี่ง่ายและใช้ง่าย:

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

คุณมีสตริงnที่เป็นหมายเลขของคุณและx ฐานของหมายเลขนั้น ก่อนอื่นให้เปลี่ยนเป็นจำนวนเต็มจากนั้นเปลี่ยนเป็น hex แต่ hex จะ0xอยู่ที่อันดับแรกก่อนด้วยเมื่อreplaceเราลบออก


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