백엔드 개발 파이썬 튜토리얼 바이너리를 처리하기 위한 Python의 구조체 사용(압축 및 압축 풀기 사용법)에 대한 자세한 소개

바이너리를 처리하기 위한 Python의 구조체 사용(압축 및 압축 풀기 사용법)에 대한 자세한 소개

Mar 19, 2017 pm 02:49 PM
struct 바이너리

예를 들어 파일에 액세스하거나 소켓 작업을 수행할 때 python을 사용해야 하는 경우가 있습니다. 이때 Python의 구조체 모듈을 사용하여 처리할 수 있습니다. c 언어 구조

struct 모듈에서 가장 중요한 세 가지 함수 는 pack(), unpack(), calcsize입니다. ()

pack(fmt, v1, v2, ...) 주어진 형식(fmt)에 따라 데이터를 문자열(실제로는 c 구조와 유사한 바이트 스트림)으로 압축합니다. )

unpack(fmt, string) 주어진 형식(fmt)에 따라 바이트 스트림 문자열을 구문 분석하고 구문 분석된 튜플을 반환합니다.

calcsize(fmt) 계산 방법 특정 형식(fmt)이 많은 바이트의 메모리를 차지합니까?

구조체에서 지원되는 형식은 다음과 같습니다.

Format C 유형 Python 바이트 수

x 패드 바이트 값 없음 1

길이가 1 1인 c char 문자열

b signed char integer 1

B unsigned char 정수 1

? _Bool bool 1

h 짧은 정수 2

H 부호 없는 짧은 정수 2

i 정수 4

I unsigned int int eger 또는 long 4

l long 정수 4

L unsigned long long 4

q long long long 8

Q unsigned long long long 8

f float float 4

d double float 8

s char[] 문자열 1

p char[] 문자열 1

P void * long

참고 1. q와 Q는 컴퓨터가 64비트 작업을 지원할 때만 유용합니다.

참고 2. 각 형식 앞에 숫자가 있을 수 있습니다. 숫자를 나타냄

참고 3. s 형식은 특정 길이의 문자열을 나타내고, 4s는 길이 4의 문자열을 나타내지만 p는 파스칼 문자열을 나타냅니다.

참고 4.P를 사용합니다. 포인터를 변환할 때 그 길이는 기계어 길이와 관련이 있다

참고 5. 마지막은 포인터 유형을 나타내는 데 사용할 수 있으며 4바이트를 차지한다

포인터와 데이터를 교환하기 위해 일부 c 또는 C++ 컴파일러는 바이트 정렬(32비트 시스템의 경우 일반적으로 4바이트)을 사용하므로 구조체는 로컬 시스템 바이트 순서에 따라 변환됩니다. 형식의 첫 번째 문자를 사용하여 변경할 수 있습니다. .정의는 다음과 같습니다.

문자 바이트 순서 크기 및 정렬

@ 네이티브 네이티브 4바이트로 구성

= 네이티브 표준 원래 개수에 따름 bytes

< 원래 바이트 수를 기준으로 한 little-endian 표준

> 원래 바이트 수를 기준으로 한 big-endian 표준

! -endian)

standard 원래 바이트 수에 따라

는 '@5s6sif'와 마찬가지로 fmt의 첫 번째 위치에 배치하여 사용됩니다.

예 1:

구조는 다음과 같습니다.

struct Header
{
    unsigned short id;
    char[4] tag;
    unsigned int version;
    unsigned int count;
}
로그인 후 복사

는 위의 구조 데이터를 소켓.recv를 통해 전달받았는데, 이는 문자열 s에 저장되어 있습니다. 이제 unpack을 사용하면 됩니다. () 함수:

import struct
id, tag, version, count = struct.unpack("!H4s2I", s)
로그인 후 복사

위의 형식 문자열 !은 데이터가 네트워크에서 수신되고 네트워크에서 전송될 때 네트워크 바이트 순서이므로 네트워크 바이트 순서 분석을 사용해야 함을 나타냅니다. 다음 H는 부호 없는 짧은 ID를 나타내고, 4s는 4바이트 길이의 문자열을 나타내며, 2I는 두 개의 부호 없는 int 유형 데이터를 나타냅니다.

이제 압축을 풀면 id, tag, version에 정보가 저장되었습니다.

마찬가지로 로컬 데이터를 구조체 형식으로 쉽게 압축할 수도 있습니다.

ss = struct.pack("!H4s2I", id, tag, version, count);
로그인 후 복사

pack 함수는 이제 지정된 형식에 따라 id, tag, version, count를 구조체 Header, ss로 변환합니다. 이는 문자열(실제로는 c 구조와 유사한 바이트 스트림)이며, Socket.send(ss)를 통해 전송될 수 있습니다.

예 2:

import struct
a=12.34
#将a变为二进制
bytes=struct.pack('i',a)
로그인 후 복사

이때 bytes는 문자열 문자열이고, 문자열은 a의 바이너리 저장소 내용과 동일합니다.

그런 다음 반대 작업을 수행하고 기존 바이너리 데이터 바이트(실제로는 문자열)를 Python의 데이터 유형 으로 변환합니다.

#참고, unpack은 튜플을 반환합니다!!

a,=struct.unpack('i',bytes)
로그인 후 복사

여러 데이터로 구성된 경우 다음과 같습니다.

a='hello'
b='world!'
c=2
d=45.123
bytes=struct.pack('5s6sif',a,b,c,d)
로그인 후 복사

이때 바이트는 바이너리 형태의 데이터로 파일에 직접 쓸 수 있습니다. 예를 들어 binfile.write(bytes)

그런 다음 필요할 때 읽을 수 있습니다. bytes=binfile.read()

再通过struct.unpack()解码成python变量:

a,b,c,d=struct.unpack('5s6sif',bytes)
로그인 후 복사

’5s6sif’这个叫做fmt,就是格式化字符串,由数字加字符构成,5s表示占5个字符的字符串,2i,表示2个整数等等,下面是可用的字符及类型,ctype表示可以与python中的类型一一对应。

注意:二进制文件处理时会碰到的问题

我们使用处理二进制文件时,需要用如下方法:

binfile=open(filepath,'rb')    
#读二进制文件
binfile=open(filepath,'wb')   
#写二进制文件
로그인 후 복사

那么和binfile=open(filepath,’r')的结果到底有何不同呢?

不同之处有两个地方:

第一,使用’r'的时候如果碰到’0x1A’,就会视为文件结束,这就是EOF。使用’rb’则不存在这个问题。即,如果你用二进制写入再用文本读出的话,如果其中存在’0X1A’,就只会读出文件的一部分。使用’rb’的时候会一直读到文件末尾。

第二,对于字符串x=’abc\ndef’,我们可用len(x)得到它的长度为7,\n我们称之为换行符,实际上是’0X0A’。当我们用’w'即文本方式写的时候,在windows平台上会自动将’0X0A’变成两个字符’0X0D’,’0X0A’,即文件长度实际上变成8.。当用’r'文本方式读取时,又自动的转换成原来的换行符。如果换成’wb’二进制方式来写的话,则会保持一个字符不变,读取时也是原样读取。所以如果用文本方式写入,用二进制方式读取的话,就要考虑这多出的一个字节了。’0X0D’又称回车符。linux下不会变。因为linux只使用’0X0A’来表示换行。

위 내용은 바이너리를 처리하기 위한 Python의 구조체 사용(압축 및 압축 풀기 사용법)에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

golang의 json.MarshalIndent 함수를 사용하여 구조를 형식화된 JSON 문자열로 변환합니다. golang의 json.MarshalIndent 함수를 사용하여 구조를 형식화된 JSON 문자열로 변환합니다. Nov 18, 2023 pm 01:59 PM

Golang에서 json.MarshalIndent 함수를 사용하여 구조를 형식화된 JSON 문자열로 변환합니다. Golang에서 프로그램을 작성할 때 구조를 JSON 문자열로 변환해야 하는 경우가 종종 있습니다. 이 과정에서 json.MarshalIndent 함수가 도움이 될 수 있습니다. 포맷된 출력. 아래에서는 이 기능을 사용하는 방법을 자세히 설명하고 구체적인 코드 예제를 제공합니다. 먼저 일부 데이터가 포함된 구조를 만들어 보겠습니다. 다음은 표시입니다

이진 산술을 계산하는 방법 이진 산술을 계산하는 방법 Jan 19, 2024 pm 04:38 PM

이진 연산은 이진수를 기반으로 하는 연산 방법으로 덧셈, 뺄셈, 곱셈, 나눗셈이 포함됩니다. 기본 연산 외에도 이진 연산에는 논리 연산, 변위 연산 및 기타 연산이 포함됩니다. 논리 연산에는 AND, OR, NOT 등의 연산이 포함되며 변위 연산에는 왼쪽 시프트 연산과 오른쪽 시프트 연산이 포함됩니다. 이러한 연산에는 해당 규칙과 피연산자 요구 사항이 있습니다.

C 언어를 사용하여 2진수를 16진수로 변환하는 방법은 무엇입니까? C 언어를 사용하여 2진수를 16진수로 변환하는 방법은 무엇입니까? Sep 01, 2023 pm 06:57 PM

이진수는 1과 0으로 표현됩니다. 16비트 16진수 체계는 2진수 표현을 16진수로 변환하기 위해 {0,1,2,3…..9,A(10),B(11),…F(15)} 비트를 나타냅니다. 문자열 ID는 최하위 쪽부터 시작하여 니블이라고 하는 4비트 청크로 그룹화됩니다. 각 블록은 해당하는 16진수로 대체됩니다. 16진수와 2진수 표현을 명확하게 이해하기 위해 예를 살펴보겠습니다. 001111100101101100011101 3 E 5 B&nb

EDVAC의 두 가지 주요 개선 사항은 무엇입니까? EDVAC의 두 가지 주요 개선 사항은 무엇입니까? Mar 02, 2023 pm 02:58 PM

EDVAC에는 두 가지 주요 개선 사항이 있습니다. 하나는 바이너리를 사용하는 것이고, 다른 하나는 저장된 프로그램을 완성하는 것입니다. 이는 하나의 프로그램 명령에서 다음 명령으로 자동으로 진행할 수 있으며 해당 작업은 명령을 통해 자동으로 완료될 수 있습니다. "명령어"란 기계의 메모리 장치에 코드 형태로 입력되는 데이터와 프로그램을 포함합니다. 즉, 데이터를 저장하는 메모리 장치와 동일한 메모리 장치를 사용하여 작업을 수행하는 명령을 저장하는 새로운 개념입니다. - 저장된 프로그램이라고 합니다.

Golang에서 바이너리 파일을 읽는 방법은 무엇입니까? Golang에서 바이너리 파일을 읽는 방법은 무엇입니까? Mar 21, 2024 am 08:27 AM

Golang에서 바이너리 파일을 읽는 방법은 무엇입니까? 바이너리 파일은 컴퓨터가 인식하고 처리할 수 있는 데이터가 포함된 바이너리 형식으로 저장된 파일입니다. Golang에서는 몇 가지 방법을 사용하여 바이너리 파일을 읽고 이를 원하는 데이터 형식으로 구문 분석할 수 있습니다. 다음은 Golang에서 바이너리 파일을 읽는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 먼저, 파일 객체를 반환하는 os 패키지의 Open 함수를 사용하여 바이너리 파일을 열어야 합니다. 그럼 우리는 만들 수 있습니다

컴퓨터에서 바이너리를 사용하는 주된 이유는 무엇입니까? 컴퓨터에서 바이너리를 사용하는 주된 이유는 무엇입니까? Apr 04, 2019 pm 02:25 PM

컴퓨터가 이진 시스템을 사용하는 주요 이유: 1. 컴퓨터는 논리 회로로 구성됩니다. 논리 회로는 일반적으로 스위치가 켜지고 꺼지는 두 가지 상태만 가지며 이 두 상태는 "1"과 "0"으로 표시될 수 있습니다. . 바이너리 시스템에서는 0과 1의 두 숫자만 사용하므로 전송 및 처리 시 오류가 덜 발생하므로 컴퓨터의 높은 신뢰성이 보장됩니다.

Go 언어에서 16진수를 2진수로 변환하는 방법을 쉽게 배웁니다. Go 언어에서 16진수를 2진수로 변환하는 방법을 쉽게 배웁니다. Mar 15, 2024 pm 04:45 PM

제목: Go 언어에서 16진수를 2진수로 변환하는 방법을 쉽게 배웁니다. 컴퓨터 프로그래밍에서는 서로 다른 진수 간의 변환 작업이 필요한 경우가 많습니다. 그중에서도 16진수와 2진수 간의 변환이 비교적 일반적입니다. Go 언어에서는 몇 가지 간단한 코드 예제를 통해 16진수를 2진수로 변환할 수 있습니다. 먼저 16진수와 2진수의 표현방법을 살펴보자. 16진수는 숫자를 표현하는 방식으로 0~9, A~F를 사용하여 1을 표현합니다.

음수를 이진수로 표현하는 방법 음수를 이진수로 표현하는 방법 Nov 23, 2023 pm 04:11 PM

음수는 2의 보수를 사용하여 컴퓨터에서 표현됩니다. 즉, 음수는 양수의 2의 보수로 표현됩니다.

See all articles