int를 16 진수 문자열로 변환하는 방법은 무엇입니까?


210

16 진수 문자열 표현으로 정수 (<255)를 가져 가고 싶습니다.

예를 들면 : 나는에 전달하려는 65밖으로 얻을 '\x41', 또는 255얻을 '\xff'.

나는 struct.pack('c',65로 이것을 시도했지만 단일 문자열을 취하기를 원하기 때문에 )위의 모든 것에 질식 9합니다.

답변:


214

chr기능을 찾고 있습니다.

정수의 10 진수 표현과 정수의 16 진수 표현을 혼합하는 것처럼 보이므로 필요한 것이 완전히 명확하지 않습니다. 귀하가 제공 한 설명을 바탕으로,이 스 니펫 중 하나가 원하는 것을 보여줍니다.

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


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

이것은 정수를 hex로 포함하는 문자열 과는 상당히 다릅니다 . 그것이 원하는 것이라면 hex내장을 사용하십시오 .


2
나는 chr이 정수를 ASCII로 변환했다고 생각했습니다. 이 경우 chr (65) = 'A'입니다. 이것은 새로운 추가입니까?
초에 사망

2
@diedthreetimes chr는 ASCII를 전혀 포함하지 않습니다. 단순히 숫자를 가져 와서 바이트의 서수 값이 숫자 인 1 바이트 바이트 문자열을 만듭니다. 바이트 열을 작성하고 표시 할 때 ASCII 및 ASCII 호환 인코딩이 작동합니다.
Mike Graham

1
예를 들어 @diedthreetimes는 'A'다른 방법으로 작성하고 표시하여 들어옵니다 '\x41'. 모두가 str정말 약이 육십 오 인 사실은 관심. 인간이 이해하고 사용할 수 있도록하기 위해 종종 A가됩니다.
Mike Graham

134

이것은 정수를 0x 접두사를 가진 2 자리 16 진 문자열로 변환합니다 :

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}'. format (15) 일 수 있습니다 (X는 대문자 임). 2034 년에는 7f2 대신 0x7F2를 인쇄합니다.
Pavel Sapehin

11

<255 (1 바이트 부호없는 uint8_t) 값으로 구조체를 패킹하고 한 문자의 문자열로 끝내려면 c 대신 B 형식을 찾고 있습니다. C는 문자를 문자열로 변환하지만 (그 자체로는 너무 유용하지는 않지만) B는 정수를 변환합니다.

struct.pack('B', 65)

(그렇습니다. 65는 \ x65가 아니라 \ x41입니다.)

구조체 클래스는 또한 의사 소통이나 다른 용도로 엔디안을 편리하게 처리합니다.


struct.pack ( 'B', <integer>)를 찾는 데 시간이 많이 걸렸습니다. 감사합니다.
Sean D.

7

큰 값의 경우 hex()여전히 작동합니다 (일부 다른 답변은 작동하지 않음).

x = hex(349593196107334030177678842158399357)
print(x)

파이썬 2 : 0x4354467b746f6f5f736d616c6c3f7dL
파이썬 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는 16 진수 인쇄 문자의 경우 2) .3은 다음을 제공합니다.

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

3

임의의 정수가 시작 부분에 #이있는 6 자리 16 진수 문자열로 변환되기를 원했습니다. 이것을 얻기 위해 나는 사용했다.

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

6
나는 당신이 의미한다고 생각합니다 "#%6x" % random.randint(0x0, 0xFFFFFF). (가 누락이다 %6randint2 개 파라미터 저급 상부 bounds- 소요)
파차

5
공백을 원하지 않으면 % 06x 여야합니다.
Janus Troelsen

3

format()당, 형식 - 예 , 우리는 할 수 있습니다 :

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

예를 들면 다음과 같습니다.

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

1

또한 모든 밑면의 숫자를 16 진수로 변환 할 수 있습니다. 이 한 줄 코드를 사용하면 쉽고 간단하게 사용할 수 있습니다.

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

당신 n은 당신의 숫자와 x 그 숫자의 기본 문자열 이 있습니다 . 먼저 정수로 변경 한 다음 16 진수로 변경하지만 16 진수는 0x첫 번째에 있으므로 replace제거합니다.


-1

대체 표현으로 사용할 수 있습니다

[in] '%s' % hex(15)
[out]'0xf'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.