파이썬에서 16 진수 문자열을 int로 변환


764

파이썬에서 16 진수 문자열을 int로 어떻게 변환합니까?

" 0xffff"또는 " " 로 표시 될 수 있습니다 ffff.

답변:


1086

0x 접두사가 없으면 명시 적으로 밑을 지정해야합니다. 그렇지 않으면 말할 방법이 없습니다.

x = int("deadbeef", 16)

0x 접두사를 사용 하면 Python은 16 진수와 10 진수를 자동으로 구별 할 수 있습니다.

>>> print int("0xdeadbeef", 0)
3735928559
>>> print int("10", 0)
10

(사용자가 해야 지정 0이 접두어 추측 동작을 호출하기 위해, 상기베이스로,베이스 (10)를지지하는 제 파라미터 수단 생략).


25
즉, 항상 16을 두 번째 인수로 사용해야합니다. 암시적인 것보다 명시적인 것이 좋습니다.
— Bachsau

13
@bachsau, 분명히 사실이 아닙니다. 16 진수 또는 10 진수로 입력 할 수있는 사용자 입력을 읽으려면 어떻게해야합니까?
— Dan Lenski

7
좋아, 나는 말했다 :이 특별한 경우에! 원래 질문은 "16 진수 문자열을 어떻게 변환합니까?"였습니다. 당신이 그것을 사용자에게 남겨두고 싶다면, 그것은 당신이 옳은 유용한 기능보다.
— Bachsau

@ DanLenski, 항상 16 진수 문자열을 양수로 변환합니다. int("FFFF",16)-1로 변환 하고 싶습니다 .
— 나사렛

@Nazar 오랜 시간이 지났 으므로이 시점에서 유용하지는 않지만 두 개의 보완 규칙을 적용 해야하는 경우 여기를 우연히 본 사람에게는 유용합니다. 이 답변은 stackoverflow.com/questions/1604464/twos-complement-in-python
— Jeremy

163

int(hexString, 16) 트릭을 수행하고 0x 접두사를 사용하거나 사용하지 않고 작동합니다.

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


43

파이썬에서 16 진수 문자열을 int로 변환

나는 그대로 "0xffff"또는 그냥 가질 수 있습니다 "ffff".

문자열을 int로 변환하려면 변환 int하려는 밑과 함께 문자열을 전달하십시오 .

다음과 같은 방법으로 두 문자열 모두 충분합니다.

>>> string_1 = "0xffff"
>>> string_2 = "ffff"
>>> int(string_1, 16)
65535
>>> int(string_2, 16)
65535

분들께 int추론

기준으로 0을 전달 int하면 문자열의 접두사에서 기준을 추론합니다.

>>> int(string_1, 0)
65535

16 진수 접두사없이 0x, int추측하기에 충분한 정보를 가지고 있지 않습니다

>>> int(string_2, 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 0: 'ffff'

리터럴 :

소스 코드 나 인터프리터를 입력하면 파이썬이 다음과 같이 변환합니다.

>>> integer = 0xffff
>>> integer
65535

ffff파이썬은 합법적 인 파이썬 이름을 쓰려고한다고 생각하기 때문에 작동하지 않습니다 .

>>> integer = ffff
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'ffff' is not defined

파이썬 숫자는 숫자로 시작하지만 파이썬 이름은 숫자로 시작할 수 없습니다.


"int 추론하기 밑줄로 0을 전달하면 int는 문자열의 접두사에서 밑줄을 추론합니다." 파이썬 인터프리터처럼 16 진수 또는 10 진수 (또는 이진)를 정수로 변환하는 방법.
— gaoithe

13

위의 Dan의 대답에 추가 : 16 진수 문자열로 int () 함수를 제공하면 밑을 16으로 지정해야하거나 유효한 값을 제공하지 않았다고 생각합니다. 문자열에 포함되지 않은 16 진 숫자에는 16 진수를 지정할 필요가 없습니다.

print int(0xdeadbeef) # valid

myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid

5

최악의 방법 :

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

>>> hex_to_int("c0ffee")
12648430

이러지 마십시오!

파이썬에서 eval을 사용하는 것은 나쁜 습관입니까?


3
그것 eval과 관련된 다른 모든 문제들보다 터무니없이 느리다는 점도 주목할 가치 가 있습니다.
— j6m8

4
이것이 나쁜 생각이라면, 그것을 제기하는 요점은 무엇입니까?
— pppery

3
좋은 지적. 부분적으로는 그것이 재미 있다고 생각하기 때문에 부분적으로 제작 코드에서 보았 기 때문입니다.
— André Laszlo

int(s,16)부적절한 값 을 반환하는 문제가 발생하여 런타임에 중요한 문제를 일으킨 후에이 작업을 수행했음을 유의해야 합니다 ( int(hex(value),16) == int(value) >>> False). 제공된 문자열 eval()은 안전하고 반환 된 값이 적절했습니다.
— Tcll

1
나는 이것이 재미 있고 깨달음을 발견했다. 나는 그것이 게시되어 기쁘다
— frogeyedpeas

3

또는 ast.literal_eval(이것은 달리 안전합니다 eval) :

ast.literal_eval("0xffff")

데모:

>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>> 

1

포맷터 옵션 '% x'%이 (가) 할당 문에서도 작동하는 것 같습니다. (Python 3.0 이상으로 가정)

예

a = int('0x100', 16)
print(a)   #256
print('%x' % a) #100
b = a
print(b) #256
c = '%x' % a
print(c) #100

주석이 잘못되었습니다. print(b)가 출력 256하지 100와 print(c)의지를 출력 100하지 256. 또한 c문자열이지만 a그렇지 않으므로 대답은 실제로 int를 문자열로 변환 하지만 다른 방법은 아닙니다 (이것은 질문에 관한 것입니다).
— André Laszlo

귀하의 의견에 감사드립니다. 나는 내 대답이 옳지 않다는 데 동의하고 지금은 그것을 고쳤습니다. 그러나 나는 대답의 일부가 위와 같이 중복된다는 것을 알고 있습니다. 즉 int (string, base)를 사용하지만 여전히 나머지 답변은 게시물에 더 많은 옵션을 추가한다고 생각합니다. 동의하다 ?
— Soundararajan

관련이 없습니다. 이것은베이스 (10)에베이스 (16)로부터가 아닌 다른 방식으로 변환 주위 관한
— pppery을

1

파이썬 인터프리터를 사용하는 경우 0x (16 진수 값)를 입력하면 인터프리터가 자동으로 변환합니다.

>>> 0xffff

65535

1

16 진, 8 진, 2 진, int 및 부동 소수점 처리

표준 접두사 (예 : 0x, 0b, 0 및 0o)를 사용하여이 함수는 적합한 문자열을 숫자로 변환합니다. https://stackoverflow.com/a/58997070/2464381 여기에 대답 했지만 필요한 기능이 있습니다.

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

Python 2.7에서는 int('deadbeef',10)작동하지 않는 것 같습니다.

다음은 나를 위해 작동합니다.

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

4
이 질문에 어떻게 대답합니까?
— pppery

-5

'0x'접두사로 eval 함수를 사용할 수도 있습니다

예를 들어

>>a='0xff'
>>eval(a)
255

16
eval을 사용하는 경우 입력 유효성 검사가 올바르게 수행되었는지 확인하십시오. 실제로 더 좋은 방법이있을 것입니다. 평가를 사용하지 마십시오.
— ALOToverflow

7
아주에서 적어도 당신이 사용되어야한다 ast.literal_eval.
— Andy Hayden

2
또한 매우 느립니다. 최악의 길.
— Tõnu Samuel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.