python模块介绍- binascii:二进制和ASCII互转以及其他进制转换

来源:互联网 发布:linux显卡驱动查看 编辑:程序博客网 时间:2024/04/30 04:55

#承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.com qq 37391319 

#版权所有,转载刊登请来函联系

#自动化测试和python群组: http://groups.google.com/group/automation_testing_python

#参考资料:《The Python Standard Library by Example》

#实验环境:Python 2.7.3 CentOS release 6.2(Final) 32bits

 

20.1 binascii:二进制和ASCII互转
作用:二进制和ASCII互相转换。

----------------------------------------------------

安装:

http://sjdzh.com/jackzou/2335
python 2.6.5 版本
./configure 顺利通过
make
报错提示:Failed to build these modules:

安装zlib-1.2.3.tar.gz
tar -zxvf zlib-1.2.3.tar.gz
./configure
然后 vi Makefile
找到 CFLAGS=-O3 -DUSE_MMAP
在后面加入-fPIC,即变成CFLAGS=-O3 -DUSE_MMAP -fPIC
接下面步骤
make
make install,然后在编译安装python即可。

------------------------------------------------------------

Python版本:1.5及以后版本

         binascii模块包含很多在二进制和ASCII编码的二进制表示转换的方法。通常情况不会直接使用这些功能,而是使用像UU,base64编码,或BinHex封装模块。 binascii模块包含更高级别的模块使用的,用C语言编写的低级高效功能。

         偶有使用于字符串和ASCII的转换,比如:

>>> s = 'hello'

>>> b = b2a_hex(s)

>>> print b

68656c6c6f

>>> a2b_hex(b)

'hello'

>>> b = hexlify(s)

>>> print b

68656c6c6f

>>> unhexlify(b)

'hello'

    上面的函数hexlify和b2a_hex实际是一个函数,建议使用hexlify。作用是返回的二进制数据的十六进制表示。每一个字节的数据转换成相应的2位十六进制表示。因此产生的字串是源数据两倍长度。a2b_hex和unhexlify则执行反向操作。

    注意区分hexlify和内置函数hex等的区别。Hex仅仅转换整数,使用字符串作为参数会报错。

>>> hex(23)

'0x17'

>>> hex(-23)

'-0x17

>>> hex('23')

Traceback (most recent call last):

  File"<stdin>", line 1, in <module>

TypeError: hex() argument can't be converted to hex

>>>

    另外浮点数转换为16进制的方法:float.hex(),比如:

>>> 1.03.hex()

'0x1.07ae147ae147bp+0'

    int([x[,base]]) 转换字符串或者数值为整。参数为字符串的时候,必须制定进制base,默认进制是10,可以取[2,36]或者0。为0的时候,进制信息从字符串中获取。Int的返回为10进制的整数。输入为浮点数时,会进行靠近0截断处理。类似的内置函数有float,long等。

>>> int(0x17)

23

>>> int(-0x17)

-23

>>> int('23')

23

>>> int('1101',2)

13

>>> int('1101',36)

47953

>>> int('1101',8)

577

>>>

>>> int(11.92)

11

>>> int(-11.92)

-11

chr(i)返回ASCII码中整数对应的单个字符串。例如,chr(97)返回字符串'a'。和ord刚好相反。该参数必须是在范围[0..255]。

unichr(i)是chr的unicode版本,例如,unichr(97)返回字符串u'a'。参数的取值范围取决于Python如何配置 - 这可能是UCS2 [0..0xFFFF]或UCS4 [0..0x10FFFF]。

ord(c)chr和unichr的反向操作。例如,ord('a')返回整数97,ord(u'\u2020')返回8224。这是CHR()(8位字符串和unichr逆的unicode对象)。如果Python是基于UCS2编译,参数范围为[0 ..65535]包容性。

Hexlify的优势在于可以同时处理多个字符。下面2个操作有一定类似性,返回值都是字符串,不过hexlify去掉了’0x’。

>>> hex(ord('a'))

'0x61'

>>> hexlify('a')

'61'

         函数列表:

binascii.a2b_uu(string)

binascii.b2a_uu(data)

binascii.a2b_base64(string)

binascii.b2a_base64(data)

binascii.a2b_qp(string[, header])

binascii.b2a_qp(data[, quotetabs, istext, header])

binascii.a2b_hqx(string)

binascii.rledecode_hqx(data)

binascii.rlecode_hqx(data)

binascii.b2a_hqx(data)

binascii.crc_hqx(data, crc)

binascii.crc32(data[, crc])

binascii.b2a_hex(data)

binascii.b2a_hex(data)

binascii.hexlify(data)

binascii.a2b_hex(hexstr)

binascii.unhexlify(hexstr)

异常有:

exception binascii.Error

exception binascii.Incomplete

 

相关模块:

Module base64

Support for base64 encoding used inMIME email messages.

Module binhexwww.2cto.com

Support for the binhex format used onthe Macintosh.

Module uu

Support for UU encoding used on Unix.

Module quopri

Support for quoted-printable encodingused in MIME email messages.

###############################################################

求CRC值 

前面要import binascii

binascii.crc32(v)  求出了v的crc32值,这是一个long型,形如-1456387L,把这个值&0xffffffff得到的值形如48a213L的形式。。。

然后把这个值用16进制表示出来

[python] view plaincopyprint?
  1. #----------------------------------------------------------------------  
  2. def _crc32(self, v):  
  3.     """ 
  4.     Generates the crc32 hash of the v. 
  5.     @return: str, the str value for the crc32 of the v 
  6.     """  
  7.     return '0x%x' % (binascii.crc32(v) & 0xffffffff)  #取crc32的八位数据 %x返回16进制  

###############################################################

調用Python內置int()函数把該字串轉為數字。以下為在Python解释器編程環境下的操作示範: 
把十六进制的字串轉為十进制數字: 
>>> print int('ff', 16) 
255 
把十进制數字转换为以十六进制表示之字串,可調用內置的hex()函数: 
>>> print hex(255) 
0xff 
調用BinAscii模块其中的b2a_hex()函数,可把以ASCII編碼的文字以十六进制表示: 
>>> print binascii.b2a_hex('A') 
41 
反之也可把以十六进制表示的文字,換成以ASCII編碼的文字: 
>>> print binascii.a2b_hex('41') 


原创粉丝点击