《2021年10月22日》 【连续第22天总结】
问题
把arr = [0x4B, 0x43, 0x09, 0xA1, 0x01, 0x02, 0xAB, 0x4A, 0x43]转换成
4B4309A10102AB4A43数据格式(去掉0x和,)
解决思路:
可以通过格式化输出将字节值变成16进制字符后,再用join()函数输出,就可以实现我们要的效果了,想打印字符串的ASCii值也可以,只不过先用ord()函数转一下,下面是我封装的两个函数,分别对应字节类型和字符串类型的输出,调试通过,仅供参考。
join()函数说明:
Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
用法:str.join(sequence)
示例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
str = "-";
seq = ("a", "b", "c"); # 字符串序列
print str.join( seq );
以上实例输出结果如下:
a-b-c
解决方案
- 打印字节类型的:
# 字节列表以16进制格式打印数据
def print_bytes_hex(data):
lin = ['%02X' % i for i in data] # [ ]内是列表解析语法 ,'%02X'%是格式化语法。
print(" ".join(lin))
# 测试字节列表
arr = [0x4B, 0x43, 0x09, 0xA1, 0x01, 0x02, 0xAB, 0x4A, 0x43]
print_bytes_hex(arr)
'''
控制台输出:
4B 43 09 A1 01 02 AB 4A 43
'''
列表解析语法说明:
简单来说,列表解析(list comprehension)提供了一种优雅的生成列表的方法,能用一行代码代替十几行代码,而且不损失任何可读性。而且,性能还快很多很多
简单给个例子,如果我们需要0~100所有偶数组成的列表,正常的代码应该是这样的:
a=[]
for i in range(101):
if i%2==0:
a.append(i)
---------------------------------------------分界线-------------------------------------------------------------------
用列表解析来做就是这样的:
a=[x for x in range(101) if x%2==0]
简单的一行代码代替了4行代码
从上面的例子来看列表解析的语法其实不难,可以分成三个部分来看
x:我们需要的列表里面的结果(1st part)
for x in range(101):x来源——0~100的数字(2nd part)
if x%2==0:x成立的条件,如果不成立就不放在列表里了(3rd part)
- 打印字符串类型的:
# 字符串或字符列表以16进制格式打印数据
def print_string_hex(data):
lin = ['%02X' % ord(i) for i in data]
print(" ".join(lin))
# 测试字符串类型
arr = 'Work'
print_string_hex(arr)
'''
控制台输出:
57 6F 72 6B
'''
python中bytes类型
对于bytes,我们只要知道在Python3中某些场合下强制使用,以及它和字符串类型之间的互相转换,其它的基本照抄字符串。
简单的省事模式:
string = b’xxxxxx’.decode() 直接以默认的utf-8编码解码bytes成string
b = string.encode() 直接以默认的utf-8编码string为bytes