python socket以16进制的数据进行传递与解析

参考:http://m.blog.csdn.net/blog/JasonQue/8256424

具体的struct模块的解释可以参照上面的链接。

struct.pack也就是将数据按照二进制的格式进行传输
#!/usr/bin/env python
#coding:utf-8
__author__ = ‘ferraborghini‘
from socket import *
import struct
#将16进制数据当做字节流传递
def dataSwitch(data):
    str1 = ‘‘
    str2 = ‘‘
    while data:
        str1 = data[0:2]
        s = int(str1,16)
        str2 += struct.pack(‘B‘,s)
        data = data[2:]
    return str2
if __name__ == "__main__":
    HOST = ‘localhost‘
    PORT = 21567
    BUFSIZE = 1024
    ADDR = (HOST,PORT)
    tcpCliSock = socket(AF_INET,SOCK_STREAM)
    tcpCliSock.connect(ADDR)
    while True:
        data = raw_input(‘>‘)
        if not data:
            break
        tcpCliSock.send(dataSwitch(data))
        data = tcpCliSock.recv(BUFSIZE)
        if not data:
            break
        print data
    tcpCliSock.close()

  

解析报文,这时候读入的其实相当于二进制流,我们要做的就将二进制流转化为16进制就行

#!/usr/bin/env python
#coding:utf-8
from socket import *
from time import ctime
if __name__ == "__main__":
    HOST = ‘‘                       #此处为空代表可以绑定所有有效地址
    PORT = 21567
    BUFSIZE = 1024
    ADDR = (HOST,PORT)
    tcpSerSocket = socket(AF_INET,SOCK_STREAM)
    tcpSerSocket.bind(ADDR)
    tcpSerSocket.listen(5)          #最多可以有5个连接同时进入
    while True:
        print ‘waiting for connection...‘
        tcpCliSock,addr = tcpSerSocket.accept()
        print ‘...connected from:‘,addr

        while True:
            data = tcpCliSock.recv(BUFSIZE)
            print data.encode(‘hex‘)
            if not data:
                break
            tcpCliSock.send(‘[%s] %s‘%(ctime(),data))
            # tcpCliSock.close()        #如果接收完,就断开的话,下次再发送就会报错,书本上有问题
    tcpSerSocket.close()

  

时间: 2024-10-10 16:54:27

python socket以16进制的数据进行传递与解析的相关文章

关于将16进制的数据存放在char数组中的问题的解决方案

首先说明一点,题目提到的问题我目前并没有解决,我在此处发表随笔就是希望看到的同学们有会的帮我解决一下. 现在来说一下我的需求: 1.定义一个数组:unsigned char cmd[6] = {0xF0,0x11,0x01,0x65,0x87,0xA9}; 2.然后将这个数组的数据写入串口中,我在写的时候发现了cmd中的数据出现了乱码的现象,于是我采用下面一种方法: 3.使用sprintf函数,于是有了下面的代码: 1 char pBuf[9]; 2 sprintf(pBuf,"%x %x %x

太有用了,所以转:Delphi下16进制位图数据转位图

如果我们在Form中拖入一个Image控件,并设置好picture后,Alt+F12就可以看到Form的源代码中已经将图片转成了16进制字符串,如下: object Image1: TImage Left = 536 Top = 24 Width = 105 Height = 105 Picture.Data = { 07544269746D61703E040000424D3E0400000000000036000000280000000700 00002B0000000100180000000

QT 串口通信 数据16进制发送

在QT中进行串口通信时,很多情况要用到发送16进制的数据.从网上找来了一段代码测试能用: static QByteArray QString2Hex(QString str) { QByteArray senddata; int hexdata,lowhexdata; int hexdatalen = 0; int len = str.length(); senddata.resize(len/2); char lstr,hstr; for(int i=0; i<len; ) { hstr=st

AndroidTCP通信,16进制数据传输实例

主要功能为手机与远程服务器进行16进制的数据收发,TCPControl类实现了16进制的数据收发功能,其中发送函数设置为每次发送4字节数据,服务器发来的数据在手机上会以Toast的形式显示出来. 代码:http://download.csdn.net/detail/miaoyunzexiaobao/8151831 PS:附件中包含TCP调试助手,使用时将调试助手设置为TCP服务器,并勾选发送与接收栏中的16进制收发的选择项 应用: 1.用户在IP和PORT编辑框中对应值,点击Set按钮,完成服务

C# 16进制与字符串、字节数组之间的转换

1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2)); //十进制转八进制 Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8)); //十进制转十六进制 Console.WriteLine("十进制166的十六进制表示: "+Con

C# 16进制与字符串、字节数组之间的转换(转)

1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串   //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2)); //十进制转八进制 Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8)); //十进制转十六进制 Console.WriteLine("十进制166的十六进制表示: "+C

C#串口通讯,16进制与字符串、字节数组之间的转换。

1.将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2));//十进制转八进制Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8));//十进制转十六进制Console.WriteLine("十进制166的十六进制表示: "+Convert.ToStrin

C语言将16进制的数转换为字符串的方法

今天在写代码的时候遇到一个需求:为了与同一产品中的其它设备统一,上位机要求处理字符串,而不是数组.我们都知道在处理数据的时候数组方便,不过考虑到兼顾别的设备(没错我说的就是TI430做的RFID读卡设备,跟上位机之间的协议传递的是字符串/大笑),就尝试了将16进制的数据改为字符串,也就是0xAB,改成"AB"...虽然看上去没什么用. 原先的数据类型是uint8_t,熟悉单片机的都知道这个的含义,其实也就是unsigned char ,说到底还是个char,但偏偏要求表示成'A&quo

C# 校验并转换 16 进制字符串到字节数组

问题 最近在进行硬件上位机开发的时候,经常会遇到将 16 进制字符串转换为 byte[] 的情况,除了这种需求以外,还需要判定一个字符串是否是有效的 16 进制数据. 解决 字符串转 byte[] 的情况可以使用 Convert.ToByte(string) 来解决,16 进制数据的判定则可以结合正则和长度来进行处理. 在这里我是只接受以下两种形式的 16 进制字符串,并对其进行验证和转换. AA 12 34 56 78 06 AA-12-34-56-78-06 下面就是代码: public s