编码和解码的定义,编码和解码名词解释一样吗,编码与解码名词解释

  编码和解码的定义,编码和解码名词解释一样吗,编码与解码名词解释

  由来:当你从网上拉图片数据(公司的图片数据库(http access))并进行在线训练时,需要对打开并通过请求读取的网页数据进行解码,因为读取的网页对象(图片对象)是字节流,所以需要将字节流类型转换成uint8类型的numpy数组,然后进一步解码成特定的(如cv2。IMREAD_COLOR)MAT对象,然后opencv才能使用它。code:respond=requests . get(img _ URL,headers=headers) if 200!=respone . status _ code:print( URL无效% s % img _ URL)continue cont=respone . content image=NP . as array(bytearray(cont),Dtype= uint 8 )image=cv2 . im decode(image,cv2.imread _ color)其中使用了python。Bytearray类型转换,目的是将其强制转换为bytearray类型。涉及到bytearray类型和python中编码解码的相关知识,这里梳理一下。

  注:本文引用了这篇博文:https://www.cnblogs.com/f-ck-need-u/p/10185965.html简介1。字符串,字节和字节数组字符串是字符数据,而字节和字节数组是字节数据。都是可以迭代的序列。而str字节是不可变序列,bytearray是可变序列,字节可以原位修改。

  Bytes和bytearray可以使用str类型的通用函数,如find()、replace()、islower()等。但不能使用str的格式操作。因此,如有必要,请参考string方法来获取这些函数的用法。

  1.1 str str将字符组合在一起,并以不可变序列存储它们。但在底层,它仍然是一个二进制数,是由字节(也就是字节)组成的,只是python根据指定的字符集编码‘强行’将字节序列显示为字符。

  python 3.x中默认字符串是以unicode格式编码的,比如UTF 8字符集。

  importsys . getdefaultencoding() UTF-8 Unicode编码的str意味着可以直接存储很多ascii码以外的字符,比如中文,比如欧洲口音。这也意味着unicode字符可以存储为多个字节,并且连续的多个字节可以转换为单个相应的字符。

  订单(a) 25105a。encode () b \ xe6 \ x88 \ x91 按照指定的字符集,底字节序列和字符序列的转换过程根本不需要人工干预,python什么都做了。

  1.2字节bytes是不可变的二进制格式字节数据(注意,是字节不是字符),用整数表示。例如,对于ascii范围内的字符“a ”,它存储为97。

  构造字节数据的方法之一是在字符串前面加上b或b。

  例如:

  B=babcd [i for i in B][97,98,99,100] B[0]=ATraceback(最近一次调用last): File stdin ,第1行,module typeerror: bytes 对象不支持项赋值字节,下面的bytearray可以使用str类型的大多数方法。比如find()、replace()等。但用法可能会有差异。例如,str.replace()的替换参数需要字符,而bytes.replace()的替换参数可能是字节。例如:

  babcd 。替换(bcd ,bXY)babXY 1.3字节数组bytearray是可变的二进制数据(byte)。

  要构造bytearray对象,其中一个方法是将bytes数据作为bytearray()方法的参数,或者将str数据和代码作为参数。

  例如:

  s=b ABCD ba=bytearray(s)[I for I in ba][97,98,99,100]ba[0]=65ba bytearray(b ABCD )1.4 Unicode字符。单字节字符(8位,共256个字符,ascii码只有7个字节)可以

  所以各国都设计了各种多字节字符码来表示自己的字符,底层还是用二进制数来存储,然后通过设计的编码表把二进制数转换成各种字符。比如中国有GBK的各种编码,还有unicode、utf-8、utf-16等通用编码。

  无论什么编码,内部都包含ascii编码(也有例外,比如utf-16),而且只需要一个字节。也就是说,ascii编码是任何其他编码表的子集。但有些编码表规定每个字符占用多少字节(例如unicode固定为2字节),有些编码表动态决定每个字符占用多少字节(例如utf-8长度可变,可能占用1-4字节,1字节存储字母,3字节存储汉字)。

  关于unicode和utf-X的编码关系,大致来说,utf-X是一种特殊类型的unicode格式。实际上,当存储utf数据时,它会自动在内部进行Unicode和utf之间的转换。

  要构建Unicode类型,只需添加U或U前缀。

  U=u 我爱你 b=bytes (u, UTF-8 )bb \ xe6 \ x88 \ x91 \ xe7 \ x88 \ xb1 \ xe4 \ xbd \ xa0 ba=bytearray(u, UTF-8) ba

  不难看出,它们是根据编码表进行翻译和映射的过程:

  代码:字符串字节

  解码:字节-字符串

  实际上,字符串类型只有encode()方法,没有decode()方法,而字节类型只有decode()方法,没有encode()方法。

  set(dir(str))-set(dir(bytes)){ encode , isidentifier 、 format } set(dir(bytes))-set(dir(str)){ decode 、 hex ,二进制格式 fromhex}的数据常被称为原始数据,所以str数据被编码得到原始数据,str被原始数据解码。

  2.1 Python中的编码和解码。如上所述,编码是将字符数据转换成字节数据(raw data),解码是将字节数据转换成字符数据。在Python中,字符数据是string,是str类型,字节数据是bytes类型或bytearray类型。编码时,可以使用字节类型的构造方法bytes()、bytearray()来构造字节,也可以使用str类型的encode()方法来转换解码时,可以使用str类型的构造方法str()来构造字符串,也可以使用bytes、bytearray()类型的decode()方法

  另外需要注意的是,编解码过程中需要指定编码表(字符集),默认采用utf-8字符集。

  2.2编码过程例如,通过编码()将str编码成字节数据。

  Str1=abcd str2= I love you #默认代码为str 1 . encode()b ABCD str 2 . encode()b \ xe6 \ x88 \ x91 \ xe7 \ x88 \ xb1 \ xe4 \ xbd \ 0 #显式指定utf-8用于编码str 1 . encode( utf-8 )b ABCD str 2 . encode( utf-8 )b \ xe6 \ x88 \ x91 \ xe7 \ x88 \ xb1EA \ x00b \ x00c \ x00d \ x00 str 2 . encode( UTF-16 )b \ xff \ xfe \ x 11 b1r ` o #使用gb2312对str 1 . encode( GB 2312 )b ABCD str 2进行编码。xcc \ XE3 # str 1 . encode( gbk )B ABCD STR 2 . encode( GBK )B \ Xce \ XD2 \ XB0 \ XAE \ XC4 \ XE3 使用bytes()和bytearray()将STR构造成

  bytes(str1,Encoding= utf-8 )b ABCD bytes(str 1,Encoding= utf-16 )b \ xff \ xfea \ x00b \ x00c \ x00d \ x00 bytearray(str 1,Encoding= utf-8 )bytearray(b ABCD )bytearray(str 2,Encoding= utf-8 )bytearray(b \ xe6 \ x88 \ x91 \ xe7 \ x88 \ xb1 \ xe4 \ xbd \ xa具体可参考help(bytes)和help(bytearray)给出的指令。这里有一些简单的例子。

  如何构造字节:

  #构造一个空字节对象bytes()b#要使用str构造一个字节序列,需要指定编码bytes (ABCD ,encoding= UTF-8) b ABCD #初始化一个5字节的字节序列bytes(5)b \ x00 \ x00 \ x00 \ x00 \ X0 #使用迭代int序列来构造字节序列# int值必须是一个0-256字节内的数([65,66,67])bABC#使用bytes或buffer来构造bytes对象bytes(b ABC

  #构造空的bytearray对象bytearray()bytearray(b)#构造bytearray序列bytearray(b ABCD )bytearray(b ABCD )使用bytes或buffer #构造bytearray序列使用str,需要指定编码bytearray (ABCD ,encoding= UTF-8 )ByteArray(b ABCD )#初始化5字节ByteArray序列ByteArray(5)ByteArray(b \ x00 \ x00 \ x00 \ X0 )#构造ByteArray

  例如,decode()方法用于解码单词“I”,其utf-8编码对应于“\xe6\x88\x91”:

  B=b\xe6\x88\x91#采用默认字符集utf-8 b.decode () I #显式指定编码表b.decode(utf-8) I 使用str()进行转换。

  Str(b, utf-8) I 2.4关于乱码。在编解码过程中使用不同的(不兼容的)编码表,就会出现乱码。所以解决乱码的唯一办法就是指定对应的编码表进行编解码。

  比如用utf-8编码单词‘I’得到一个字节序列,然后用gbk解码这个字节序列。

  我。编码()。decode (gbk) traceback(最近一次调用last):moduleunicodedecode中文件 stdin ,第1行错误: gbk 编解码器无法解码位置2中的字节0x91:不完整的多字节序列。这里报告了一个错误,因为utf-8中有GBK无法解码的字节。如果你使用文本编辑器这样的工具来演示这个过程,你会得到乱码。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: