python怎么初始化结构体_python使用struct解析结构体

本文展示了如何使用Python的struct模块解析网络数据包。通过创建套接字连接,接收数据,然后使用struct模块将接收到的缓冲区数据解包为结构体,从而获取IP地址的各个部分。示例代码包括了客户端和服务器端的实现。
摘要由CSDN通过智能技术生成

#!/bin/python

from socket import *

from time import time,ctime

host = ""

port = 12345

bufsize = 1024

addr = (host,port)

socket = socket(AF_INET,SOCK_STREAM)

socket.bind(addr)

socket.listen(5)

try:

while 1:

print "waiting for connection..."

client,addr = socket.accept()

print "..connected from :",addr

while 1:

data = client.recv(bufsize)

if not data:break

print "received:",len(data)

import struct

ip = struct.unpack("HHIII0l",data)

print "ip[0]",ip[0]

print "ip[1]",ip[1]

print "ip[2]",ip[2]

print "ip[3]",ip[3]

break

client.close()

except EOFError:

print 'EOFError Occur'

except KeyboardInterrupt:

print 'KeyboardInterrupt catched'

finally:

socket.close()

#include

#include

#include

#include

#include

#include

#include

#include

extern int errno;

int main(int argc, char **argv)

{

int sockfd;

struct sockaddr_in servaddr;

if (argc != 3)

fprintf(stderr, "usage: cmd \n");

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {

fprintf(stderr, "socket create error.\n");

exit(1);

}

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons(atoi(argv[2]));

if ( inet_pton(AF_INET, argv[1], &(servaddr.sin_addr)) < 0) {

fprintf(stderr, "inet_pton error: %s\n", strerror(errno));

close(sockfd);

return -1;

}

if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) {

fprintf(stderr, "connect fail: %s\n", strerror(errno));

exit(1);

}

int len = sizeof(struct sockaddr_in);

char send[len + 1];

memset(send, 0, len+1);

memcpy(send, &servaddr, len);

//unsigned char sin_len = servaddr.sin_len;

unsigned short sa_family = servaddr.sin_family;

unsigned short sin_port = servaddr.sin_port;

unsigned int s_addr = servaddr.sin_addr.s_addr;

printf("%u %u %u\n", sa_family, sin_port, s_addr);

int n=0;

n = write(sockfd, send, len);

if (n != len) {

printf("write error\n");

}

printf("write over\n");

exit(0);

}

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2009-10-14 23:20

浏览 4646

评论

根据提供的引用内容,Python解析位域结构体需要考虑大端格式和小端格式。对于大端格式,不需要进行其他转换操作,只需对起始位及长度进行判断即可自动生成自动化代码。而对于小端格式,需要进行字节序转换后再进行解析。 以下是Python解析位域结构体的示例代码: ```python import struct # 定义位域结构体 class BitFieldStruct: def __init__(self, data): self.field1 = (data[0] >> 7) & 0x01 self.field2 = (data[0] >> 6) & 0x01 self.field3 = (data[0] >> 5) & 0x01 self.field4 = (data[0] >> 4) & 0x01 self.field5 = (data[0] >> 3) & 0x01 self.field6 = (data[0] >> 2) & 0x01 self.field7 = (data[0] >> 1) & 0x01 self.field8 = data[0] & 0x01 self.field9 = (data[1] >> 7) & 0x01 self.field10 = (data[1] >> 6) & 0x01 self.field11 = (data[1] >> 5) & 0x01 self.field12 = (data[1] >> 4) & 0x01 self.field13 = (data[1] >> 3) & 0x01 self.field14 = (data[1] >> 2) & 0x01 self.field15 = (data[1] >> 1) & 0x01 self.field16 = data[1] & 0x01 # 定义数据 data = b'\x12\x34' # 解析大端格式的位域结构体 bit_field_struct = BitFieldStruct(data) print(bit_field_struct.field1) print(bit_field_struct.field2) print(bit_field_struct.field3) print(bit_field_struct.field4) print(bit_field_struct.field5) print(bit_field_struct.field6) print(bit_field_struct.field7) print(bit_field_struct.field8) print(bit_field_struct.field9) print(bit_field_struct.field10) print(bit_field_struct.field11) print(bit_field_struct.field12) print(bit_field_struct.field13) print(bit_field_struct.field14) print(bit_field_struct.field15) print(bit_field_struct.field16) # 解析小端格式的位域结构体 little_endian_data = struct.unpack('<H', data)[0] little_endian_bit_field_struct = BitFieldStruct(struct.pack('>H', little_endian_data)) print(little_endian_bit_field_struct.field1) print(little_endian_bit_field_struct.field2) print(little_endian_bit_field_struct.field3) print(little_endian_bit_field_struct.field4) print(little_endian_bit_field_struct.field5) print(little_endian_bit_field_struct.field6) print(little_endian_bit_field_struct.field7) print(little_endian_bit_field_struct.field8) print(little_endian_bit_field_struct.field9) print(little_endian_bit_field_struct.field10) print(little_endian_bit_field_struct.field11) print(little_endian_bit_field_struct.field12) print(little_endian_bit_field_struct.field13) print(little_endian_bit_field_struct.field14) print(little_endian_bit_field_struct.field15) print(little_endian_bit_field_struct.field16) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值