python2与python3解析数据

蓝牙模块接收到监测设备传输来的数据,封装格式为十六进制的数据帧,蓝牙模块将数据通过串口发送给wrtnode 2p,wrtnode通过ser2net服务将数据转为网络数据,可以通过监听192.168.8.1:2001实现对数据的抓取,环境为python3时通过socket编程接收收据并无问题,但是当环境为python2时出现了数据解析乱码问题。于是经过以下测试完成对数据的转换。

python3.5

#python3
taylen@ubuntu:~$ python3
Python 3.5.2 (default, Oct  8 2019, 13:06:37) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> s='\xaa'
>>> print(s)
ª
>>> s=s.encode('raw_unicode_escape')
>>> s
b'\xaa'
>>> print(s)
b'\xaa'
>>> s[0]
170
>>> print(s[0])
170

python2.7

对于ASCII中无对应的数据,例如'\xaa'

>>> s
'\xaa'
>>> print(s)
�
>>> ss =s.encode('string_escape')
>>> ss
'\\xaa'
>>> ss[0]
'\\'
>>> ss[1]
'x'
>>> ss[2]
'a'
>>> sss=int(ss[ss.find('x')+1:],16)
>>> sss
170

对于ASCII对应的,无法通过encode('string_escape')将转义字符‘\’去掉,可通过ord()实现。

while True:
    recvDate = tcpClientSocket.recv(1)
    #print(recvDate)
    #time.sleep(0.01)
    print("run--------")
    rs = recvDate[0]
    rs = rs.encode('string_escape')
    rslen = len(rs)
    if rslen > 2:
        rd = int(rs[rs.rfind('x')+1:],16)
    else:
        if rslen == 1:
            rd = ord(rs)
        else:
            rs = rs.decode('string_escape')
            rd = ord(rs)
    print rd

最后发现上述所有操作都是多余。。。。。。。。。。。。。

只需ord()一步即可完成!!!!!!!!!!!!!!!!!

#!/usr/bin/python
from socket import *
import time

tcpClientSocket = socket(AF_INET, SOCK_STREAM)
print('start')
serAddr = ('192.168.8.1', 2002)
tcpClientSocket.connect(serAddr)

while True:
    recvDate = tcpClientSocket.recv(1)
    #print(recvDate)
    #time.sleep(0.01)
    print("run--------")
    rs = recvDate[0]
    rd = ord(rs)
    print rd
    if rd == 170:
        print('yes')

tcpClientSocket.close()
print('end')

python中的字符数字之间的转换函数

int(x [,base ])         将x转换为一个整数    
long(x [,base ])        将x转换为一个长整数    
float(x )               将x转换到一个浮点数    
complex(real [,imag ])  创建一个复数    
str(x )                 将对象 x 转换为字符串    
repr(x )                将对象 x 转换为表达式字符串    
eval(str )              用来计算在字符串中的有效Python表达式,并返回一个对象    
tuple(s )               将序列 s 转换为一个元组    
list(s )                将序列 s 转换为一个列表    
chr(x )                 将一个整数转换为一个字符    
unichr(x )              将一个整数转换为Unicode字符    
ord(x )                 将一个字符转换为它的整数值    
hex(x )                 将一个整数转换为一个十六进制字符串    
oct(x )                 将一个整数转换为一个八进制字符串   
 
 
chr(65)='A'
ord('A')=65
 
int('2')=2;
str(2)='2'

 

你可能感兴趣的:(python2与python3解析数据)