1. 소개
Python은 C/C++ 및 Python 데이터 형식을 변환하기 위해 파일의 바이너리 데이터를 읽고 쓰려면 struct 모듈을 사용해야 합니다.
2. 구조체 모듈 소개
구조체 모듈에서 가장 일반적으로 사용되는 함수는 pack과 unpack입니다. fmt,v1,v2… )
string 주어진 형식(fmt)에 따라 데이터를 문자열(바이트 스트림)로 변환하고 문자열을 반환합니다. |
| pack_into(fmt,buffer,offset,v1, v2… ) | None
주어진 형식(fmt)에 따라 데이터를 문자열(바이트 스트림)로 변환하고 오프셋으로 시작하는 버퍼에 바이트 스트림을 씁니다. (버퍼는 쓰기 가능한 버퍼, 사용 가능한 배열 모듈)
| unpack(fmt,v1,v2……) | tuple | 지정된 형식(fmt)에 따라 바이트 스트림을 구문 분석하고 구문 분석 결과를 반환
| pack_from(fmt, buffer ,offset) | tuple | 주어진 형식(fmt)에 따라 오프셋으로 시작하는 버퍼를 구문 분석하고 구문 분석 결과를 반환합니다.
| calcsize(fmt) | fmt의 크기 | 주어진 형식(fmt)이 몇 바이트를 차지하는지 계산합니다. 메모리 정렬에 주의하세요
|
3. 구조체 모듈의 fmt 데이터 형식은 C/C++ 및 Python |
|
Format | C Type | Python type | Standard의 유형에 해당합니다. 크기
signed char | integer | 1 |
| B
unsigned char
integer | 1 |
| ?
_Bool |
bool
1 |
|
h | short |
integer
2 |
|
H |
unsigned short |
integer
2 |
|
i |
int |
integer 4 |
|
I |
unsigned int |
정수
4 | |
l |
long |
integer
4 |
|
L |
unsigned long |
integer
4 |
|
ㅋ |
롱롱 |
8
|
Q |
ed long long |
integer |
8
| f |
float |
float |
4
|
d |
double |
float |
8
|
s |
문자[] | 문자열 |
|
| p | char[ ] | string
|
|
P |
void * |
integer
|
|
|
4. 예 |
참고: 코드, < 리틀 엔디안을 의미, > 빅 엔디안을 의미합니다. import struct
# 打开文件
with open("binary_file.bin", "wb") as f:
# 写入4个字节的整数(值为12345)
int_value = 12345
f.write(struct.pack("<i", int_value))
# 写入8个字节的双精度浮点数(值为3.14159)
double_value = 3.14159
f.write(struct.pack("<d", double_value))
# 写入一个字节的布尔值(值为True)
bool_value = True
f.write(struct.pack("<?", bool_value))
# 写入一个定长字符串(10个字符,值为"hello")
string_value = "hello".encode("utf-8")
f.write(struct.pack("<5s", string_value))
# 写入一个定长字节数组(20个字节,值为b"\x01\x02\x03...\x14")
byte_array_value = bytes(range(1, 21))
f.write(struct.pack("<20s", byte_array_value))
f.close()
# 打开文件
with open("binary_file.bin", "rb") as f:
# 读取4个字节,解析成一个整数
int_value = struct.unpack("<i", f.read(4))[0]
# 读取8个字节,解析成一个双精度浮点数
double_value = struct.unpack("<d", f.read(8))[0]
# 读取一个字节,解析成一个布尔值
bool_value = struct.unpack("<?", f.read(1))[0]
# 读取一个字符串,解析成一个定长字符串(10个字符)
string_value = struct.unpack("<5s", f.read(5))[0].decode("utf-8")
# 读取一个字节数组,解析成一个定长字节数组(20个字节)
byte_array_value = struct.unpack("<20s", f.read(20))[0]
# 打印结果
print(f"int_value: {int_value}")
print(f"double_value: {double_value}")
print(f"bool_value: {bool_value}")
print(f"string_value: {string_value}")
print(f"byte_array_value: {byte_array_value}")
f.close()
로그인 후 복사
5. Python 문자열 앞에 u, r, b, f를 추가하는 의미 | 다음 문자열은 유니코드 형식으로 인코딩되며 일반적으로 소스 코드 저장 형식 문제를 방지하기 위해 중국어 문자열 앞에 사용되어 다시 사용할 때 문자가 깨집니다. | str= u'hello'
로그인 후 복사
5.2. 백슬래시 전송 메커니즘을 제거하려면 문자열 앞에 r | 을 추가하세요. (특수 문자: 백슬래시와 해당 문자는 해당 특수 의미를 나타냅니다. 예를 들어 가장 일반적인 "n"은 줄 바꿈을 의미하고 "t"는 탭을 의미합니다.)
str= r'hello\n\t\n' 로그인 후 복사 | 5.3 문자열 앞에 b를 추가합니다
. 문자열이 바이트 유형임을 나타냅니다. bytes = b'hello' 로그인 후 복사 | Python3에서 바이트와 str 사이의 상호 변환 방법은 str.encode(‘utf-8')
bytes.decode(‘utf-8') 로그인 후 복사 | 5.4입니다. 문자열 앞에 f를 추가합니다 | f로 시작한다는 것은 문자열에서 중괄호 안의 Python 표현식이 지원된다는 의미이며, 문자열 연결name = 'Lily'
print(f'My name is {name}.') 로그인 후 복사 |
위 내용은 Python을 사용하여 바이너리 파일을 읽고 쓰는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!