[python] binary data와 16진수 / struct.pack
binary data
hex, bin
```python
hex = 0xf1
bin = 0b11110001
```
unicode / bytes 변환 int to ascii
문자열을 bytes로 형변환 하고 싶다면 이 방법이 제일 간단하기는 하다.
```python
a = b'string to byte'
```
b'\x80' 으로 직접 지정하면 \x80 이상 data도 입력할 수 있다.
```python
hex(ord('a')) #unicode -> byte
chr(0x61) #byte -> unicode
```
ord는 설명으로는 ASCII 변환이라고 써있기는 하지만 `` \x81``같은 데이터를 넘겨도 잘 동작한다.
struct.pack
binary data를 little endian으로 정렬할 때는 struct module을 사용하면 편하다.
```python
struct.pack(fmt, v1, v2, ...)
```
fmt의 첫 번째 문자로는 byte order, size, alignment를 지정할 수 있다.
'<'를 지정하면 little-endian으로 정렬해준다.
두 번째 문자 부터는 Format characters ( 변수의 type )을 지정할 수 있다.
자주 쓰는 건 unsigned long인 'L' 이다.
```python
import struct
def p32(x): return struct.pack('<L', x)
def u32(x): return struct.unpack('<L', x)[0] # 투플로 반환되니 반드시 [0] 써주어야 한다.
def p8(x): return pack('B', x)
def p64(x): return pack('<Q', x)
sfp = 0xfeffe0e0
print(L(sfp))
==============
b'\xe0\xe0\xff\xfe'
```
(void *) 크기로 맞추기
```python
addr.ljust(8, "\x00")
```
원래 `` ljust()``는 문자열을 왼쪽으로 정렬하기 위한 함수이나, 이렇게 응용할 수 있다.
'Languages & Frameworks > Python' 카테고리의 다른 글
[python] 람다(lambda), 함수형 fileter / map / reduce (2) | 2017.07.02 |
---|---|
[python] Comprehension, Generator / iterator VS iterable / itertools (0) | 2017.07.02 |
[python] 출력 관련 : 문자열, str <> bytes, bytearray (2) | 2017.05.09 |
[python] Jupyter notebook (2) | 2017.04.16 |
[python] numpy, pandas, sklearn (0) | 2017.03.11 |