zoukankan      html  css  js  c++  java
  • python二进制数据

    一直以来对python的二进制数据搞不清楚。

    一、二进制显示格式与实际存储值区别

    1.二进制数据在python中以字节(bytes)类型和字节数组类型(bytearray)保存着,前者数据固定,后者不固定,可继续添加。其每个元素为一个字节的数值,这就要求每个元素数值必须位于【0,255】之间,因为一个字节只能表示这个范围的数据。

    2.由于字节或字节数组类型元素只能处于【0,255】之间,因此要表示中文(通常是三个字节(utf-8编码)),必须将中文转成字节格式,下例就出错了:

    >>> b'中文'
      File "<stdin>", line 1
    SyntaxError: bytes can only contain ASCII literal characters.

    错误原因是字节只能包含ASCII常量字符

    解决办法是先将中文字符转其他类型的编码即可,如转成utf-8编码:

    >>> '中文'.encode('utf-8')
    b'xe4xb8xadxe6x96x87'

    这就是unicode与bytes之间相互转化方式,我们循环这个bytes:

    >>> for i in b'xe4xb8xadxe6x96x87':
    ...     print(i)
    ...
    228
    184
    173
    230
    150
    135

    发现字符“中”由三个8位数据构成,即228 184 173,我们将其转化成二进制格式:

    >>> bin(228)
    '0b11100100'
    >>> bin(184)
    '0b10111000'
    >>> bin(173)
    '0b10101101'

    发现字符“中”的utf-8编码方式为:11100100 10111000 10101101,这也是它在计算机中存储的方式。

    3.ASCII码能够表示的字符(0-9a-zA-Z及一些标点符号转义字符等)转化成utf-8码不发生改变,因为utf-8编码是ASCII编码的超集。

    >>> 'afAFA!@#'.encode('utf-8')
    b'afAFA!@#'

    而实际上存储的是各字符的ASCII码值:

    >>> for i in b'afAFA!@#':
    ...     print(i)
    ...
    97
    102
    65
    70
    65
    33
    64
    35

    当中英文混合时我们看的更清楚:

    >>> '中c'.encode()
    b'xe4xb8xadc'

    我们看到最后的字符c并没有发生转义成十六进制,仍然是c。

    这就是说明,tytes类型显示格式是十六进制格式,ASCII码原样不改变,但最终存储的值还是对应十六进制值格式对等的二进制格式值。

    始终记住:显示的是十六进制格式,存储的是对应的码值。如:

    >>> b'a'[0]
    97

    显示的是字符a,实际上保存的是对应的ASCII码值97.

    二、binascii模块:

    binascii模块定义了很多二进制转化的函数。

    binascii.hexlify() 将单个字符转化成对应码值的十六进制格式(xxx)格式

    >>> binascii.hexlify(b'xefmm')
    b'ef6d6d'

    binascii.unhexlify() 两个字符为单位,看作十六进制值,转化成对应码值的字符格式

    >>> binascii.unhexlify(b'ef6d6d')
    b'xefmm'

    因此参数里不能是基数个字符

     

  • 相关阅读:
    shell中逻辑与的两种表示方法
    Git学习之Git恢复进度
    RH318之域控服务器
    《征服C指针》读书笔记
    2013年:一个技术领导的启程
    sqlite的一个Unable to Open database file的坑爹错误
    我的2013——青春的躁动
    C/C++注册动态对象到Lu系统并进行运算符重载
    Geeks面试题:Min Cost Path
    Leetcode Gray Code
  • 原文地址:https://www.cnblogs.com/zhuluqing/p/8482452.html
Copyright © 2011-2022 走看看