바이너리 디코딩이란?
바이너리 디코딩은 이진 데이터를 사람이 읽을 수 있는 형식으로 변환하는 프로세스를 의미한다.
Python에서 디코딩하는 방법은 여러가지가 있는데, 그 중 3가지를 소개해 보려고 한다.
소켓통신할 때 이미지를 수신, 전송할 때 base64모듈을 사용해본적은 있지만 아직도 조금 생소한 감이 있다.
struct 모듈 사용
struct 모듈은 Python에서 이진 데이터를 특정 형식에 따라 인코딩하는 데 사용되는 모듈이다. 이 모듈을 사용하여 바이너리 데이터를 인코딩하려면 struct.pack()함수를 사용한다.
struct.pack()을 사용한 인코딩
struct.pack() 함수는 지정된 형식 문자열을 기반으로 바이너리 데이터를 패킹하여 인코딩한다. 형식 문자열은 인코딩하려는 데이터의 형식을 지정한다.
예를 들어, 정수를 4바이트의 리틀 엔디안(또는 빅 엔디안)바이너리로 인코딩하는 방법은 다음과 같다.
import struct
integer_value = 42 # 인코딩할 정수 값
binary_data = struct.pack('<i', integer_value) # 리틀 엔디안으로 4바이트 정수 인코딩
위의 코드에서 <i는 리틀 엔디안에서 4바이트 정수를 나타내는 형식 문자열이다. 빅 엔디안을 사용하려면 >를 사용할 수 있다.
바이너리 데이터 결합
struct.pack()을 사용하여 여러 개의 데이터를 바이너리로 인코딩한 후, 이 데이터를 결합할 수 있다.
예를 들어, 두 개의 정수를 함께 인코딩하고 이를 결합하는 방법은 다음과 같습니다:
이렇게 하면 combined_data 에는 두 개의 정수가 포함된 연속된 바이너리 데이터가 저장된다.import struct int1 = 42 int2 = 100 binary_data1 = struct.pack('<i', int1) binary_data2 = struct.pack('<i', int2) combined_data = binary_data1 + binary_data2
struct.unpack()을 사용한 디코딩
struct 모듈을 사용하면 바이너리 데이터를 특정 형식으로 읽을 수 있다. 이 모듈을 사용하려면 데이터의 바이트 순서와 형식을 지정해야 한다.
예를 들어, 4바이트 정수를 읽는 코드는 다음과 같이 만들 수 있다.
import struct
binary_data = b'\x01\x00\x00\x00' # 예시 바이너리 데이터
integer_value = struct.unpack('I', binary_data)[0]
print(integer_value)
출력하면 1이 나온다.
int.from_bytes 메서드 사용
Python의 int.from_bytes 메서드를 사용하여 바이너리 데이터를 정수로 디코딩할 수 있다.
이 메서드를 사용하면 바이트 순서를 지정할 수 있다.
예를 들어, 아래와 같이 코드를 작성할 수 있다.
binary_data = b'\x01\x00\x00\x00' # 예시 바이너리 데이터
integer_value = int.from_bytes(binary_data, byteorder='little', signed=False)
print(integer_value)
출력하면 1이 나온다.
base64모듈 사용
Base64는 이진 데이터를 텍스트 형식으로 인코딩하는 방법 중 하나이다. 주로 이진 데이터를 텍스트 형태로 전송하거나 저장할 때 사용된다. Python에서 base64 모듈을 사용하여 인코딩 및 디코딩을 수행할 수 있다.
Base64 인코딩:
이진 데이터를 Base64로 인코딩하려면 base64모듈의 b64encode 함수를 사용한다.
import base64
binary_data = b'Hello, World!' # 인코딩할 이진 데이터
base64_encoded = base64.b64encode(binary_data)
print(base64_encoded.decode('utf-8')) # 인코딩된 데이터를 문자열로 출력
base64.b64함수는 이진 데이터를 Base64로 인코딩한 결과를 바이트 문자열로 반환한다.
Base64 디코딩:
Base64로 인코딩된 데이터를 디코딩하려면 base 모듈의 b64encode 함수를 사용한다.
import base64
base64_encoded = 'SGVsbG8sIFdvcmxkIQ==' # 디코딩할 Base64 문자열
binary_data = base64.b64decode(base64_encoded)
print(binary_data.decode('utf-8')) # 디코딩된 이진 데이터를 문자열로 출력
base64.b64decode 함수는 Base64로 인코딩된 문자열을 이진 데이터로 디코딩한 결과를 바이트 문자열로 반환한다.
주의할 점은 Base64로 인코딩하면 데이터 크기가 더 커지므로, 원본 크기가 중요한 경우 고려해야 한다.
Base64는 주로 이진 데이터를 전송하거나 저장해야 할 때 주로 사용되며, 이진 데이터의 무결성이나 보안이 중요한 경우에는 사용하지 않는 것이 좋다.