본문 바로가기
대동단결 Python

통신을 위한 바이트 편집에 관한 python

by 즐거운 지니 2024. 9. 3.
반응형

바이트 내부 비트 순서에 관한 용어

  • MSB (Most Significant Bit): 가장 왼쪽 비트
  • LSB (Least Significant Bit): 가장 오른쪽 비트
  • MSB-first: 가장 왼쪽 비트 부터 처리됨을 의미
  • LSB-first: 가장 오른쪽 비트 부터 처리됨을 의미

크기가 2바이트 이상 데이터를 메모리에 저장할 때 바이트 순서에 따른 용어

4바이트 숫자 0x12345678를 예로 들어

  • MSB(Most Significant Byte): 가장 중요한 바이트 = 가장 큰 단위 숫자에 해당하는 바이트 = 가장 왼쪽 바이트. 이때 Bbit가 아니라 byte임에 주의 , 예에서 0x12
  • LSB(Least Significant Byte): 가장 덜중요한 바이트 = 가장 작은 단위 숫자에 해당하는 바이트 = 가장 오른쪽 바이트. 예에서 0x78
  • 빅 엔디언 (Big Endian): MSB-first, MSB를 먼저 로드한다.
    • 주소 0: 0x12
    • 주소 1: 0x34
    • 주소 2: 0x56
    • 주소 3: 0x78
  • 리틀 엔디언 (Little Endian): LSB-first, LSB를 먼저 로드한다.
    • 주소 0: 0x78
    • 주소 1: 0x56
    • 주소 2: 0x34
    • 주소 3: 0x12

숫자 표현

2진수

숫자 앞에 접두어 0b를 붙임

16진수

숫자 앞에 접수어 0x를 붙임

16진수로 변환

숫자.hex()
hex(숫자) # 접두어가 빠진다.

2진수로 변환

숫자.bin()
bin(숫자) # 접두어가 빠진다.

10진수로 변환

# 다른 진법의 숫자를 10진수로 변환
decimal_from_binary = int("1101", 2)  # 2진수 1101 -> 10진수 13
decimal_from_hex = int("1F", 16)      # 16진수 1F -> 10진수 31
decimal_from_octal = int("21", 8)     # 8진수 21 -> 10진수 17

print(decimal_from_binary)  # 출력: 13
print(decimal_from_hex)     # 출력: 31
print(decimal_from_octal)   # 출력: 17

포멧 문자열

문자 바이트 순서 크기 정렬
@ 네이티브 네이티브 네이티브
= 네이티브 표준 none
< 리틀 엔디안 표준 none
> 빅 엔디안 표준 none
! 네트워크 (= 빅 엔디안) 표준 none
포맷 C형 파이썬 형 표준 크기 노트
x 패드 바이트 값이 없습니다   (7)
c char 길이가 1인 bytes 1  
b signed char 정수 1 (1), (2)
B unsigned char 정수 1 (2)
? _Bool bool 1 (1)
h short 정수 2 (2)
H unsigned short 정수 2 (2)
i int 정수 4 (2)
I unsigned int 정수 4 (2)
l long 정수 4 (2)
L unsigned long 정수 4 (2)
q long long 정수 8 (2)
Q unsigned long long 정수 8 (2)
n ssize_t 정수   (3)
N size_t 정수   (3)
e (6) float 2 (4)
f float float 4 (4)
d double float 8 (4)
s char[] bytes   (9)
p char[] bytes   (8)
P void* 정수   (5)
import struct

# 4바이트 정수를 포함한 구조체
data_native = struct.pack('@I', 1)   # 시스템 기본 바이트 순서 및 정렬
data_packed = struct.pack('=I', 1)   # 시스템 기본 바이트 순서, 정렬 없음
data_little = struct.pack('<I', 1)   # 리틀 엔디언, 정렬 없음
data_big = struct.pack('>I', 1)      # 빅 엔디언, 정렬 없음
data_network = struct.pack('!I', 1)  # 빅 엔디언(네트워크), 정렬 없음

print(data_native)  # 출력: 시스템에 따라 다름
print(data_packed)  # 출력: 예) b'\x01\x00\x00\x00'
print(data_little)  # 출력: b'\x01\x00\x00\x00'
print(data_big)     # 출력: b'\x00\x00\x00\x01'
print(data_network) # 출력: b'\x00\x00\x00\x01'
반응형

댓글