structモジュールの概要
2795 ワード
structの概要
structを使用するとpythonの数値とCの構造の間で変換することができ、表示方式はPython stringsである.一般的には、ファイル内のバイナリデータ(例えば、BMPピクチャ)やネットワーク接続中のメッセージ(例えば、OSPF、EIGRPメッセージコンテンツ)の処理に使用される.
方法:
フォーマットパラメータ:fmt
Order Character
Character
Byte order
Size
Alignment
@
native
native
native
=
native
standard
none
<
little-endian
standard
none
>
big-endian
standard
none
!
network(= big-endian)
standard
none
Format Character
Format
C Type
Python Type
Standard size
x
pad byte
no value
string of length 1
1
integer
1
integer
1
bool
1
integer
2
integer
2
integer
4
integer
4
integer
4
integer
4
integer
8
integer
8
float
4
float
8
string
string
integer
Examples
Construct the first part of an IP packet
Unpack a string according to the format character
structを使用するとpythonの数値とCの構造の間で変換することができ、表示方式はPython stringsである.一般的には、ファイル内のバイナリデータ(例えば、BMPピクチャ)やネットワーク接続中のメッセージ(例えば、OSPF、EIGRPメッセージコンテンツ)の処理に使用される.
方法:
struct.pack(fmt, v1, v2, ...)
fmtで規定されたフォーマットに従ってv 1,v 2,...コンテンツはパッケージ化する、パッケージ化(変換)されたバイトコードを返す.struct.pack_into(fmt, buffer, offset, v1, v2, ...)
fmtで規定されたフォーマットに従ってv 1,v 2,...コンテンツはパッケージ化する、パッケージ化されたコンテンツをbufferのoffset位置に書き込む.struct.unpack(fmt, string)
は、fmtで規定するフォーマットに従ってstring(実はバイトコード)をunpack(復号)し、復号内容をメタグループとして返す.struct.unpack_from(fmt, buffer[, offset=0])
は、bufferにおけるoffset位置の先頭のコンテンツをfmtに従って復号し、結果をメタグループ形式で返す.struct.calcsize(fmt)
は、fmtが指定したフォーマット変換後のデータ長を返す(unit:Byte)フォーマットパラメータ:fmt
Order Character
Character
Byte order
Size
Alignment
@
native
native
native
=
native
standard
none
<
little-endian
standard
none
>
big-endian
standard
none
!
network(= big-endian)
standard
none
Format Character
Format
C Type
Python Type
Standard size
x
pad byte
no value
c
char
string of length 1
1
b
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
integer
4
l
long
integer
4
L
unsigned long
integer
4
q
long long
integer
8
Q
unsigned long long
integer
8
f
float
float
4
d
double
float
8
s
char[]
string
p
char[]
string
P
void *
integer
Examples
Construct the first part of an IP packet
import struct
#69 is Version and IHL, 0 is TOS, 1420 is Total Length
first_line = struct.pack('>BBH', 69, 0, 1420)
print(first_line)
> b'E\x00\x05\x8c'
#calculate the length of format '>BBH'
struct.calcsize('>BBH')
> 4
Unpack a string according to the format character
import struct
s1 = b'E\x00\x05\x8c'
#unpack the string s1 (s1 is Bytes) according to format '>BBH'
result = struct.unpack('>BBH', s1)
print(result)
>(69, 0, 1420)