zoukankan      html  css  js  c++  java
  • python——bytes、bytearray

    1、python3引入两个新类型
      1>bytes:
        在内存中连续存放的不可变字节序列

      2>bytearray:
        字节数组、可变

      3>字符串与bytes
        字符串是字符组成的有序序列,字符可以使用编码来理解
        bytes是字节组成的有序的不可变序列
        bytearray是字节组成的有序的可变序列

      4>编码与解码
        字符串按照不同的字符集编码encode返回字节序列bytes
          encode(encoding='utf-8', errors='strict') → bytes

    # -*- coding:utf-8 -*-
    # version:python3.7
    
    s1 = ''.encode(encoding='gbk')    #按gbk编码
    s2 = s1.decode(encoding='gbk')      #按gbk解码,编码解码得对应,要不然会出错
    print(s1,s2)
    
    执行结果:
    b'xb0xa1'

        字节序列按照不同的字符集解码decode返回字符串
          bytes.decode(encoding="utf-8", errors= "strict") → str
          bytearray.decode(encoding="utf-8", errors="strict") → str

    # -*- coding:utf-8 -*-
    # version:python3.7
    
    s1 = 'abc'
    b1 = s1.encode()
    print(s1,b1)
    s2 = b1.decode()
    print(s2)
    
    b2 = bytearray(b1)
    print(b2)
    
    执行结果:
    abc b'abc'
    abc
    bytearray(b'abc')

    2、ASCII
      ASCII (American Standard Code for Information Interchange,美国信息交换标准代码) 是基于拉丁字母的一套单字节编码系统

      

       熟记:

    Tab、回车、换行        对应ASCII表10进制数
         	                     9
         
                         13
         
                         10
    
    
    数值、字母 对应ASCII表16进制数
    0~9 1:31(16进制) → 3*16+1=49(10进制) A-Z A:41(16进制) → 4*16+1=65(10进制) a-z a:61(16进制) → 6*16+1=97(10进制)

      编码表:

    ASCII:   0-127
    Unicode: 全球统一编码(双字节表达,中英都是)
    GBK:     英文用单字节,中文用双字节
    UTF-8:   中文三字节,英文单字节

    3、bytes定义
      bytes()    空bytes

    # -*- coding:utf-8 -*-
    # version:python3.7
    
    b1 = bytes()
    b2 = b''
    print(b1,b2)
    
    执行结果:
    b'' b''

      bytes(int)    指定字节的bytes,被0填充

    # -*- coding:utf-8 -*- 
    # version:python3.7


    print
    (bytes(3)) 执行结果: b'x00x00x00'

      bytes(iterable_of_ints) → bytes [0,255]    的int组成的可迭代对象

    # -*- coding:utf-8 -*-
    # version:python3.7
    
    print(bytes([61,62]))      #ASCII:十进制61,62 -> '=>'
    print(bytes([0x61,0x62]))  #ASCII:十六进制61,62 -> 'ab'
    print(bytes([97,98]))      #ASCII:十六进制97,98 -> 'ab'
    
    执行结果:
    b'=>'
    b'ab'
    b'ab'

           bytes(string, encoding[ errors]) → bytes    等价于string.encode()

    # -*- coding:utf-8 -*- 
    # version:python3.7


    print
    (bytes('abc','utf8')) print('abc'.encode()) 执行结果: b'abc' b'abc'

      bytes(bytes_or_buffer) → immutable copy of bytes_or_buffer    从一个字节序列或者buffer复制出一个新的不可变的bytes对象

    # -*- coding:utf-8 -*- 
    # version:python3.7

    b1 = bytes([0x61,0x62]) b2 = b1 #认为重新包装成字节序列 print(b1,b2) print(id(b1),id(b2)) #python对某些常量进行了优化,bytes和str一样属于字面常量 执行结果: b'ab' b'ab' 1777529096928 1777529096928

      使用b前缀定义
        只允许基本ASCII使用字符形式b'abc9'
        使用16进制表示b"x41x61"

    4、bytes操作
      和str类型类似,都是不可变类型,所以方法很多都一样,只不过bytes的方法,输入是bytes,输出是bytes

    # -*- coding:utf-8 -*-
    # version:python3.7
    
    print(b'abcdef'.replace(b'f',b'k'))    #replace:替换
    print(b'abcdef'.find(b'c'))            #find:查找,返回索引
    
    执行结果:
    b'abcdek'
    2

      类方法bytes.fromhex(string)
        string必须是2个字符的16进制的形式,'61 62 6a 6b',空格将被忽略
      hex()
        返回16进制表示的字符串

        例:'abc'.encode().hex()

    # -*- coding:utf-8 -*-
    # version:python3.7
    
    b1 = bytes.fromhex('6162 09 6a 6b00')
    print(b1)
    b2 = b1.hex()
    print(b2)
    
    执行结果:
    b'ab	jkx00'
    6162096a6b00

      索引
        例:b'abcdef'[2]    返回该字节对应的十进制数,int类型

    # -*- coding:utf-8 -*-
    # version:python3.7
    
    print(b'abcdef'[2])
    
    执行结果:
    99

    5、bytearray定义
      bytearray()    空bytearray
      bytearray(int)    指定字节的bytearray,被0填充
      bytearray(iterable_of_ints) → bytearray [0,255]的int组成的可迭代对象
      bytearray(string, encoding[, errors]) → bytearray近似string.encode(),不过返回可变对象
      bytearray(bytes_or_buffer)     从一个字节序列或者buffer复制出一个新的可变的bytearray对象

    注意,b前缀定义的类型是bytes类型

    6、bytearray操作
      和bytes类型的方法相同

    # -*- coding:utf-8 -*-
    # version:python3.7
    
    print(bytearray(b'abcdef').replace(b'f',b'k'))
    print(bytearray(b'abc').find(b'b'))
    
    执行结果:
    bytearray(b'abcdek')
    1

      类方法bytearray.fromhex(string)
        string必须是2个字符的16进制的形式,'61 62 6a 6b',空格将被忽略
      hex()
        返回16进制表示的字符串

    # -*- coding:utf-8 -*-
    # version:python3.7
    
    b1 = bytearray.fromhex('6162 09 6a 6b00')
    print(b1)
    print(b1.hex())
    
    执行结果:
    bytearray(b'ab	jkx00')
    6162096a6b00

      索引
        例:bytearray(b'abcdef')[2]    返回该字节对应的数,int类型

    # -*- coding:utf-8 -*-
    # version:python3.7
    
    print(bytearray(b'abcdef')[2])
    
    执行结果:
    99

      append(int)    尾部追加一个元素
      insert(index, int)    在指定索引位置插入元素
      extend(iterable_of_ints)     将一个可迭代的整数集合追加到当前
      pop(index=-1)    从指定索引上移除元素,默认从尾部移除
           remove(value)    找到第一个value移除, 找不到抛ValueError异常

    # -*- coding:utf-8 -*-
    # version:python3.7
    
    b = bytearray(b'abcd')
    print(b)
    b.append(101)
    print(b)
    b.insert(0,65)
    print(b)
    b.extend(range(102,106))
    print(b)
    b.pop(0)
    print(b)
    b.remove(105)
    print(b)
    
    执行结果:
    bytearray(b'abcd')
    bytearray(b'abcde')
    bytearray(b'Aabcde')
    bytearray(b'Aabcdefghi')
    bytearray(b'abcdefghi')
    bytearray(b'abcdefgh')

      注意:上述方法若需要使用int类型,值在[0, 255]
      clear()        清空bytearray
      reverse()    翻转bytearray,就地修改

    7、字节序:
      大端模式,big-endian;小端模式,little-endian
      Intel X86 CPU使用小端模式
      网络传输更多使用大端模式
      Windows、Linux使用小端模式
      Mac OS使用大端模式
      Java虚拟机是大端模式

    8、int和bytes
      int.from_bytes(bytes, byteorder)
        将一个字节数组表示成整数
      int.to_bytes(length, byteorder)
        byteorder字节序
        将一个整数表达成一个指定长度的字节数组

    # -*- coding:utf-8 -*-
    # version:python3.7
    
    i = int.from_bytes(b'abcd','big')    #大端模式将 bytes -> int
    print(i,hex(i))
    print(i.to_bytes(4,'big'))           #使用大端模式将 int -> bytes (给定四字节)
    
    b1 = 97
    print(b1.to_bytes(3,'big'))
    
    执行结果:
    1633837924 0x61626364
    b'abcd'
    b'x00x00a'
  • 相关阅读:
    面试汇总
    Windows 环境下的 protoc 安装(转)
    Hbase 元数据一致性检查(转)
    Slow ReadProcessor&Error Slow BlockReceiver错误日志分析(转)
    Hbase CMS GC 调优。
    [技术]排查线上问题
    crontab 误删恢复
    Hbase balancer RSgroup shell 脚本
    Hbase运维手册(1)
    Presto JVM.config
  • 原文地址:https://www.cnblogs.com/zyybky/p/12559706.html
Copyright © 2011-2022 走看看