Loading [MathJax]/jax/output/CommonHTML/jax.js
본문 바로가기
대동단결 Python

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

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

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

  • MSB MostSignificantBit: 가장 왼쪽 비트
  • LSB LeastSignificantBit: 가장 오른쪽 비트
  • MSB-first: 가장 왼쪽 비트 부터 처리됨을 의미
  • LSB-first: 가장 오른쪽 비트 부터 처리됨을 의미

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

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

  • MSBMostSignificantByte: 가장 중요한 바이트 = 가장 큰 단위 숫자에 해당하는 바이트 = 가장 왼쪽 바이트. 이때 Bbit가 아니라 byte임에 주의 , 예에서 0x12
  • LSBLeastSignificantByte: 가장 덜중요한 바이트 = 가장 작은 단위 숫자에 해당하는 바이트 = 가장 오른쪽 바이트. 예에서 0x78
  • 빅 엔디언 BigEndian: MSB-first, MSB를 먼저 로드한다.
    • 주소 0: 0x12
    • 주소 1: 0x34
    • 주소 2: 0x56
    • 주소 3: 0x78
  • 리틀 엔디언 LittleEndian: 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'
반응형

댓글