파이썬에서 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하지 100print(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.