关于python中send发送十六进制的方法

由于经常从wireshark中抓数据包,需放在python进行发送,但socket中的send发送与c不同,终于找到一种可以将c数组转换为python socket send数据的方法,特此记录!

从wireshark 中抓取的包,用c array表示:

char peer0_0[] = { /* Packet 40 */
0x00, 0x00, 0x00, 0x2c, 0x63, 0x00, 0x00, 0x00, 
0x75, 0x4b, 0xef, 0x0f, 0x00, 0x03, 0x00, 0x00, 
0x01, 0x00, 0x00, 0x7f, 0x00, 0x01, 0x00, 0x00, 
0x88, 0x9f, 0xfa, 0xfd, 0x9f, 0x22, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x01 };

转为python的列表或元组:

a=[0x00, 0x00, 0x00, 0x2c, 0x63, 0x00, 0x00, 0x00, 
0x75, 0x4b, 0xef, 0x0f, 0x00, 0x03, 0x00, 0x00, 
0x01, 0x00, 0x00, 0x7f, 0x00, 0x01, 0x00, 0x00, 
0x88, 0x9f, 0xfa, 0xfd, 0x9f, 0x22, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x01]

在python中使用struct模块

import struct

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',8000))
date=struct.pack("%dB"%(len(a)),*a)
s.send(date)

就可以直接用send发送了。

date数据如下:

b'\x00\x00\x00,c\x00\x00\x00uK\xef\x0f\x00\x03\x00\x00\x01\x00\x00\x7f\x00\x01\x00\x00\x88\x9f\xfa\xfd\x9f"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01'

------------------------------------------------------------------------------------------------------------------------------------------------------------------

import asyncore
import struct
import threading
a=[0x00, 0x00, 0x00, 0x2c, 0x63, 0x00, 0x00, 0x00,
0x75, 0x4b, 0xef, 0x0f, 0x00, 0x03, 0x00, 0x00,
0x01, 0x00, 0x00, 0x7f, 0x00, 0x01, 0x00, 0x00,
0x88, 0x9f, 0xfa, 0xfd, 0x9f, 0x22, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01]


class SocketClient(asyncore.dispatcher):
    def __init__(self, host, port,buffer=""):
        asyncore.dispatcher.__init__(self)
        self.create_socket()
        self.connect( (host, port) )
        self.buffer=buffer
    def handle_connect(self):
        print("handle_connect")
        pass
    def handle_close(self):
        print("handle_close")
        self.close()
    def handle_read(self):
        print("handle_read")
        print(self.recv(81920))
    def writable(self):
        print("writable")
        return (len(self.buffer) > 0)
    def handle_write(self):
        print("handle_write")
        sent = self.send(self.buffer)
        self.buffer = self.buffer[sent:]

class SocketClientThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        client = SocketClient("192.168.50.174", 8080)
        client.buffer = struct.pack("%dB" % (len(a)), *a)
        asyncore.loop()


SocketClientThread().start()

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值