为什么python打印数据显⽰为b“xxx“格式
这种情况出现在我的下位机向上位机传递数据后,上位机在打印数据的过程中。
举⼀个例⼦:
我的下位机是⼀个单⽚机,会通过串⼝向上位机发送⼀段数据。这⾥随意写⼀个C下位机的程序
include "stm32f10x.h"
include "delay.h"
int main(void)
{
print("112233test332211\n");
}
也随意写⼀个python上位机的程序
import serial
s = serial.Serial('com7', 9600, timeout=3)
data = s.readline()
print(data)
很明显的可以看出来,下位机通过串⼝com7与上位机连接,波特率是9600,不过这是次要的,按理说,上位机读取⼀⾏数据后再把读取的数据打印下来,就应该和下位机⼀样的数据,显⽰为:
112233test332211
可是并不是这样的,在我的控制台⾥显⽰如下:
b'112233test332211'
这是为什么呢?
Python3的字符串的编码语⾔⽤的是unicode编码,由于python的字符串类型是str,在内存中以unicode表⽰,⼀个字符对应若⼲字节,如果要在⽹络上传输,或保存在磁盘上就需要把str变成以字节
为单位的bytes.
python对bytes类型的数据⽤带b前缀的单引号或双引号表⽰
'ABC'
b'ABC'
要注意区分‘ABC'和b'ABC',前者是str,后者虽然内容显得和前者⼀样,但bytes的每个字符都只占⽤⼀个字节。
扩展内容
python bytes类型及⽤法
python bytes类型⽤来表⽰⼀个字节串,“字节串”不是编程术语,是我⾃⼰“捏造”的⼀个词,⽤来和字符串相呼应。
bytes是python 3.x新增的类型,在python 2.x中是不存在的。
字节串(bytes)和字符串(string)的对⽐:
字符串由若⼲个字符组成,以字符为单位进⾏操作,字节串由若⼲个字节组成,以字节为单位进⾏操作。
字节串和字符串除了操作的数据单元不同之外,它们⽀持的所有⽅法都基本相同。
字节串和字符串都是不可变序列,不能随意增加和删除数据
bytes只负责以字节序列的形式(⼆进制形式)来存储数据,⾄于这些数据到底表⽰什么内容(字符串,数字,图⽚,⾳频等),完全由程序的解析⽅式决定,如果采⽤合适的字符编码⽅式(字符集),字节串可以恢复成字符串,反之亦然,字符串也可以转换成字节串。
说⽩了,bytes只是简单地记录内存中的原始数据,⾄于如何使⽤这些数据,bytes并不在意,你想怎么使⽤就怎么使⽤,bytes并不约束你的⾏为。
bytes类型的数据⾮常适合在互联⽹上传输,可以⽤于⽹络通信编程,bytes也可以⽤来存储图⽚,⾳频,视频等⼆进制格式的⽂件。
字符串和bytes存在着千丝万缕的联系,我们可以通过字符串来创建bytes对象,或者说将字符串转换成bytes对象。有以下三种⽅法可以达到这个⽬的:
1.如果字符串的内容都是ASCII字符,那么直接在字符串前⾯添加“b"前缀
2.bytes是⼀个类,调⽤它 的构造⽅法,也就是bytes(),可以将字符串按照给定的字符集转换成bytes,如果不指定字符集,那么默认采⽤UTF-8
3.字符串本⾝有⼀个encode()⽅法,该⽅法专门⽤来将字符串按照指定的字符集转换成对应得字节串,如果不指定字符集,那么默认采⽤UTF-8.
#通过构造函数创建空 bytes
b1 = bytes()
#通过空字符串创建空 bytes
b2 = b''
#通过b前缀将字符串转换成 bytes
# b3=b'C语⾔中⽂⽹8岁了' #这样写就是不对的,b后⾯必须是ASCII码
b3=b'12345'
print("b3: ", b3)# b'12345'
python怎么读取串口数据print('b3[3]',b3[3],'b3[4]',b3[4])#b3[3] 52 b3[4] 53
print('b3[0:6]',b3[0:6])#b'12345'
bb = b'c.biancheng/python/'#
print("bb: ", bb)# b'c.biancheng/python/'
print('bb[3]',bb[3],'bb[4]',bb[4])#bb[3] 112 bb[4] 58
print('bb[0:6]',bb[0:6])#bb[0:5] b'http:/'
#为 bytes() ⽅法指定字符集
b4 = bytes('C语⾔中⽂⽹8岁了', encoding='UTF-8')
print("b4: ", b4)
#通过 encode() ⽅法将字符串转换成 bytes
b5 = "C语⾔中⽂⽹8岁了".encode('UTF-8')#b'C\xe8\xaf\xad\xe8\xa8\x80\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x918\xe5\xb2\x81\xe4\xba\x86'
print("b5: ", b5)
str1=b5.decode('UTF-8')
print('str1:',str1)
字符编码中ASCII,Unicode和UTF-8得区别
最早时只有127个字母被编码到计算机⾥,也就是⼤⼩写英⽂字母,数字和⼀些符号,这个编码表被称为ASCII编码,⽐如⼤写字母A得编码是65,⼩写字母z的编码是122,但是要处理中⽂显然⼀个字节是不够的,⾄少需要两个字节,⽽且不能和ASCII编码冲突,所以,中国制定了GB2312编码,⽤来把中⽂编进去。你可以想得到的是,全世界有上百种语⾔,⽇本把⽇⽂编到Shift_JIS中,韩国把韩⽂编导Euc-kr⾥,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语⾔混合的⽂本中,显⽰出来会有乱码。
因此,Unicode应运⽽⽣,Unicode把所有语⾔都统⼀到⼀套编码⾥,这样就不会再有乱码问题了。
Unicode标准也在不断发展,但最常⽤的是⽤两个字节表⽰⼀个字符(如果要⽤到⾮常偏僻的字符,就需要4个字节),现代操作系统和⼤多数编程语⾔都直接⽀持Unicode.
新的问题⼜出现了,如果统⼀成Unicode编码,乱码问题从此消失了,但是,如果你系的⽂本基本上全部是英⽂的话,⽤Unicode编码⽐Ascii编码需要多⼀倍的存储空间,在存储和传输上就⼗分不划算。
所以本着节约的精神,⼜出现了把Unicode编码转化为”可变长编码“的UTF-8编码,UTF-8编码把⼀个Unicode字符根据不同的数字⼤⼩编码成1-6个字节,常⽤的英⽂字母被编码成1个字节,汉字通常是3个字节,只有很⽣僻的字符才会被编码成4-6个字节,如果你要传输的⽂本包含⼤量英⽂字符,⽤UTF-8编码就能节省空间。
UTF-8编码有⼀个额外的好处,就是ASCII编码实际上可以被看成UTF-8编码的⼀部分,所以⼤量只⽀持ASCII编码的历史遗留软件可以在UTF-8编码下继续⼯作。
1.ASCII
ASCII只有127个字符,表⽰阴闻字母的⼤⼩写,数字和⼀些符号。
2.Unicode
由于每个国家的语⾔都有属于⾃⼰的编码格式,在多语⾔编辑⽂本中会出现乱码,这样Unicode应运⽽⽣,Unicode就是将这些语⾔统⼀到⼀套编码格式中,通常两个字节表⽰⼀个字符,⽽ASCII是⼀个字节表⽰⼀个字符,这样如果你编译的⽂本是全英⽂的,⽤unicode编码⽐ASCII编码需要多⼀倍的存储
空间,在存储和传输上就⼗分不划算。
3.UTF-8
为了解决上述问题,⼜出现了把Unicode编码转化为”可变长编码“的UTF-8编码,UTF-8编码将Unicode字符按数字⼤⼩编码为1-6个字节,英⽂字母被编码成1个字节,常⽤汉字被编码成3个字节,如果你编译的⽂本时纯英⽂的,那么⽤UTF-8就会⾮常节省空间,并且ASCII码也是UTF-8的⼀部分。
字节是什么?
字节时⼆进制数据的单位,⼀个字节通常8位长。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论