zoukankan      html  css  js  c++  java
  • Python字节数组【bytes/bytearray】

    bytes

    >>> type(b'xxxxx')
    <class 'bytes'>
    
    >>> type('xxxxx')
    <class 'str'>

    bytes是byte的序列,而str是unicode的序列。

    1、str 转换成 bytes 用 encode() 方法:(注意:这有个坑,str1.encode不加括号和加括号是不一样的,自己试试,初学貌似2.0不影响,3.0变了,不加括号开发环境语法不报错)

    str = '人生苦短,我用Python!'
    bytes = str.encode()
    print(bytes)

    输出:

    b'xe4xbaxbaxe7x94x9fxe8x8bxa6xe7x9fxadxefxbcx8cxe6x88x91xe7x94xa8Python!'

    2、好了,反转换 decode() :

    bytes = b'xe4xbaxbaxe7x94x9fxe8x8bxa6xe7x9fxadxefxbcx8cxe6x88x91xe7x94xa8Python!'
    str = bytes.decode()
    print(str)

    输出:

    人生苦短,我用Python!

    bytearray

    1、bytearray和bytes不一样的地方在于,bytearray是可变的。

    str = '人生苦短,我用Python!'
    bytes = bytearray(str.encode())
    bytes = bytearray(b'xe4xbaxbaxe7x94x9fxe8x8bxa6xe7x9fxadxefxbcx8cxe6x88x91xe7x94xa8Python!')
    str = bytes.decode()
    print(str)

    输出:

    '人生苦短,我用Python!'

    2、改变bytearray

    bytes[:6] = bytearray('生命'.encode())
    bytes = bytearray(b'xe7x94x9fxe5x91xbdxe8x8bxa6xe7x9fxadxefxbcx8cxe6x88x91xe7x94xa8Python!')
    str = bytes.decode()
    print(str)

    输出:

    生命苦短,我用Python!

    各种 bytes :

    a = bytes('abc', 'utf-8')  
    print(a)
    > b'abc'
    
    b  = bytes(1)  
    print(b)
    > b'x00'
    
    c = bytes([2,3,6,8])  
    print(c)
    > b'x02x03x06x08'
    
    print(b"Python")
    > b'Python'
    
    python = (b'P' b'y' b"t" b'o' b'n')
    print(python)
    > b'Pyton'

     Bytes 代表的是(二进制)数字的序列,只不过在是通过 ASCII 编码之后才是我们看到的字符形式,如果我们单独取出一个字节,它仍然是一个数字:

    print(b"Python"[0])
    > 80

    我们可以用 b"*" 的形式创建一个字节类型,前提条件是这里的 * 必须是 ASCII 中可用的字符,否则将会超出限制:

    print(b"")
    > File "", line 1
       print(b"")
             ^
    SyntaxError: bytes can only contain ASCII literal characters.

    错误提示说明:字节类型只能允许 ASCII 字符(0~127~255)。ASCII 表里面所有的字符只占据了 [31, 127]

    那对于这一范围之外的数字我们要怎么才能表示为字节类型?答案就是用特殊的转义符号x+十六进制数字 :

    print(b'xff'[0])
    > 255
    print(b'x24')
    > b'$'

    反过来我们也可以将数字(0~255)转变成转义后的字节类型:

    print(bytes([24]))
    > b'x18'
    print(bytes([36,36,36])) # 记住字节类型是一个序列

    或者直接从十六进制得来:

    print(bytes.fromhex("7b 7d"))
    > b'{}'
    # 逆运算 print(b'{ }'.hex())
    > 7b207d int(b
    ' '.hex(), base=16)
    > 32

    测试的一些代码:

    print("$".encode('ascii'))
    > b'$'
    print("$".encode('ascii')[0])
    > 36

    ba = bytearray(b'hello')
    ba[0:1] = b'w'
    print(ba)
    bytearray(b'wello')

    可是如果我们对一些奇怪的字符进行 ASCII 编码,就会发生异常:ordinal not in range(128)

  • 相关阅读:
    C# LINQ和Lambda表达式详解
    .NET面试题2021.7.13
    linux每日命令(11):cat命令
    linux每日命令(10):touch命令
    linux每日命令(9):cp命令
    linux每日命令(8):mv命令
    linux每日命令(7):rmdir命令
    linux每日命令(5):mkdir命令
    进程和线程的区别?什么时候用进程?什么时候用线程?
    八种方式实现跨域请求
  • 原文地址:https://www.cnblogs.com/fieldtianye/p/8276552.html
Copyright © 2011-2022 走看看