Bir int'i bir hex dizesine nasıl dönüştürebilirim?


210

Onaltılı bir dize gösterimine (<= 255) bir tam sayı almak istiyorum

örneğin: Ben geçmek 65ve dışarı çıkmak '\x41'ya da 255ve almak istiyorum '\xff'.

Ben struct.pack('c',65 ile bunu denedim ), ama 9tek bir karakter dizesi almak istediği için yukarıdaki herhangi bir şey boğuluyor .

Yanıtlar:


214

chrİşlevi arıyorsunuz .

Tamsayıların ondalık gösterimlerini ve tamsayıların onaltılık gösterimlerini karıştırıyor gibi görünüyorsunuz, bu yüzden neye ihtiyacınız olduğu tam olarak açık değil. Verdiğiniz açıklamaya dayanarak, bu snippet'lerden birinin ne istediğinizi gösterdiğini düşünüyorum.

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


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

Bunun hex olarak bir tamsayı içeren bir dizeden oldukça farklı olduğuna dikkat edin . İstediğiniz bu ise, hexyerleşik olanı kullanın .


2
Ben chr tamsayı ascii dönüştürdü düşündüm. Bu durumda chr (65) = 'A'. Bu yeni bir ek mi?
ölenler bazen

2
@ bazen, chrASCII içermez - sadece bir sayı alır ve baytın sıra değerinin sayı olduğu bir baytlık bir bayt yapar. Yan dizeleri yazıp görüntülerken ASCII ve ASCII uyumlu kodlamalar devreye girer.
Mike Graham

1
@diedthreetimes, Örneğin, 'A'yazmak ve görüntülemek için başka bir yol yaparak gelirler '\x41'. Tüm strgerçekten ilgili bu altmış beş olduğu gerçektir umurunda. İşleri insanlar tarafından anlaşılabilir ve kullanılabilir hale getirmek için, genellikle A olur
Mike Graham

134

Bu, bir tamsayıyı 0x önekiyle 2 basamaklı onaltılık bir dizeye dönüştürür:

strHex = "0x%0.2X" % 255

2
Burada kodu düzenlemek ve bunu değiştirmek öneririz: strHex = "0x% 0.2X"% integerVariable. (Kendimi düzenleyemedim.)
Samuel

58

Ne olmuş hex()?

hex(255)  # 0xff

Gerçekten \önde olmak istiyorsanız şunları yapabilirsiniz:

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

repr(chr(255)) # '\xff'Ayrıca bunu başarıyor
Glenn 'devalias'


31

Bunu eklememe izin verin, çünkü bazen sadece tek haneli temsili istersiniz:

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

Ve şimdi yeni f''biçim dizeleri ile şunları yapabilirsiniz:

f'{15:x}'
> f

NOT: ilk 'f' girişi f'{15:x}'bir biçim dizesini belirtmektir


Bu düzgün özellik için referans olarak, PEP 498 - Değişmez Dize Enterpolasyonu
MFT

1
IMHO, biraz daha "okunabilir" seçeneği '0x {: X}'. Biçiminde (15) olabilir (X bildirimi büyük harftir). 2034 için 7f2 yerine 0x7F2 yazdıracak
Pavel Sapehin

11

<255 (bir bayt imzasız, uint8_t) değerine sahip bir yapı paketlemek ve bir karakterden oluşan bir dize oluşturmak istiyorsanız, büyük olasılıkla c yerine B biçimini arıyorsunuz . C bir karakteri dizeye dönüştürür (tek başına çok kullanışlı değildir), B ise bir tamsayıyı dönüştürür.

struct.pack('B', 65)

(Ve evet, 65 \ x41, \ x65 değil.)

Struct sınıfı, iletişim veya diğer kullanımlar için endianizmi de uygun şekilde ele alacaktır.


Struct.pack'i ('B', <tamsayı>) bulmam zaman aldı. Teşekkür ederim.
Sean

7

Büyük değerler için hex()hala çalışır (diğer bazı cevapların işe yaramadığını) unutmayın:

x = hex(349593196107334030177678842158399357)
print(x)

Python 2: 0x4354467b746f6f5f736d616c6c3f7dL
Python 3:0x4354467b746f6f5f736d616c6c3f7d

Şifresi çözülmüş bir RSA mesajı için aşağıdakiler yapılabilir:

import binascii

hexadecimals = hex(349593196107334030177678842158399357)

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

5

Bu benim için en iyisi oldu

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

Daha büyük bir genişliğe sahip bir sayı istiyorsanız (2) değiştirin (2 altıgen yazdırılan karakter içindir), böylece 3 size aşağıdakileri verecektir:

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

3

Ben başında bir # ile altı basamaklı bir hex dizeye dönüştürülmüş rastgele bir tamsayı istedim. Bunu elde etmek için kullandım

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

6
Sanırım demek istiyorsun "#%6x" % random.randint(0x0, 0xFFFFFF). (Daha %önce bir eksik var 6ve daha düşük randintve üst sınırlar) 2 parametre alır)
pacha

5
Boşluk istemiyorsanız% 06x olmalıdır
Janus Troelsen

3

İle format()uyarınca, biçim-örnekler , yapabileceğimiz:

>>> # 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()

Örneğin:

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

1

Ayrıca herhangi bir bazdaki herhangi bir sayıyı hex'e dönüştürebilirsiniz. Bu tek satır kodunu kullanın, kullanımı kolay ve basittir:

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

Bir dize var nsenin numarası ve bir x o sayının tabanı. İlk olarak, tamsayıya ve sonra onaltılı olarak değiştirin, ancak hex'in 0xilkinde vardır , böylece replacekaldırırız.


-1

Alternatif bir temsil olarak kullanabilirsiniz

[in] '%s' % hex(15)
[out]'0xf'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.