Home

Gabriel's Blog

<맨 위로>

파이썬 진수변환 정복하기

서론

파이썬은 고도로 추상화된 언어다. 가만 보면 이것도 객체고 저것도 객체다.

많은 경우 파이썬의 이런 점은 굉장히 편하다. 변수에 함수를 때려넣어도 멀쩡히 돌아가는가 하면, 'string'.strip()처럼 문자열 객체 내 함수를 호출하는, 생각해 보면 해괴한 짓도 당연한 듯 사용한다.

C언어 유저에겐 이상하지 않을 수 없는 것이다. 아니 문자는 분명 아스키 코드로 저장되는데 저게 뭐람.

아무튼 이러한 이유로, 파이썬에서 문자열, 10진수, 2진수, 8진수, 16진수에 대한 저장 형태가 따로 존재하고 심지어 2/8/16진수는 따지고 보면 그냥 문자열이다.

어디 이뿐이랴? Bytes와 ByteArray라는, 바이트 정보를 따로 저장하는 객체도 마련되어 있다. 본질적으로는 죄다 숫자인데, 각 포맷을 추상화하고 멤버함수를 도입하는 과정에서 이 사단이 난 게 아닌가 싶다.


본론

각설하고 이 녀석들을 서로 변환하는 방법이나 알아보자.

정수를 다른 형식으로 변환

>>> bin(42)
'0b101010'
>>> oct(42)
'0o52'
>>> hex(42)
'0x2a'
>>> str(42)
'42'
>>> bytes([42])
b'*'
>>> bytearray([42])
bytearray(b'*')

bin, oct, hex는 문자열인 주제에 앞에 이상한 식별 기호가 붙어 있다. 어째서 이런 만행을 저질렀는지는 모르겠으나 다행히도 대안이 있다.

>>> format(42, 'b')
'101010'
>>> format(42, 'o')
'52'
>>> format(42, 'x')
'2a'
>>> format(42, 'X')
'2A'

다른 형식을 정수로 변환

>>> int('0b101010', 2)
42
>>> int('0o52', 8)
42
>>> int('0x2a', 16)
42
>>> int.from_bytes(b'*', byteorder='big')
42

bytes와 문자열 간 변환

>>> 'abc'.encode()
b'abc'
>>> b'abc'.decode()
'abc'

응용

저 친구들을 잘 조합하면 다양한 응용이 가능하다. 예를 들어,

문자열을 비트스트링으로 만들기

>>> "".join(format(ord(c), "0>8b") for c in 'abc')
'011000010110001001100011'

비트스트링을 문자열로 만들기

>>> a = '011000010110001001100011'
>>> "".join(chr(int(a[i:i+8], 2)) for i in range(0, len(a), 8))
'abc'

등등…


오늘의 한 줄

저걸 다 기억하기 힘들다면 이곳에 와드를 박자.

그럼 다음에,
Gabriel-Dropout at 16:37

scribble