[CTF]python求crc32值的方法

python求crc32值的方法

  本文实例讲述了python求crc32值的方法。分享给大家供大家参考。具体实现方法如下:
  要想求CRC值,前面要import binascii
  binascii.crc32(v) 求出了v的crc32值,这是一个long型,形如-1456387L,把这个值&0xffffffff得到的值形如48a213L的形式。
  然后把这个值用16进制表示出来

Python2

import binascii
def _crc32(self, v): 
  """ 
  Generates the crc32 hash of the v. 
  @return: str, the str value for the crc32 of the v 
  """
  return '0x%x' % (binascii.crc32(v) & 0xffffffff) #取crc32的八位数据 %x返回16进制

根據官方文件,在 Python 2.x 的版本中,binascii.crc32 所計算出來的 CRC 值域為 [-2^31, 2^31-1] 之間的有號整數,為了要與一般 C 所實作的 CRC 結果作比對,需要將其轉為無號整數,所以加上「& 0xffffffff」這段來做轉換。
如果是 python 3.x 的版本,其計算結果為 [0, 2^32-1] 間的無號整數,因此不需額外加上修正。

Python3(存在问题)

使用binascii方法一直出现报错TypeError: a bytes-like object is required, not ‘str‘

解决办法

binascii.crc32("1".encode())

原理

在新版本的python3中,取消了unicode类型,代替它的是使用unicode字符的字符串类型(str),字符串类型(str)成为基础类型如下所示,而编码后的变为了字节类型(bytes)但是两个函数的使用方法不变:

   decode    encode

bytes ——> str(unicode)——>bytes

u = ‘中文‘ #指定字符串类型对象u
str = u.encode(‘gb2312‘) #以gb2312编码对u进行编码,获得bytes类型对象str
u1 = str.decode(‘gb2312‘)#以gb2312编码对字符串str进行解码,获得字符串类型对象u1
u2 = str.decode(‘utf-8‘)#如果以utf-8的编码对str进行解码得到的结果,将无法还原原来的字符串内容

原文 Python2
原文 Python3

你可能感兴趣的:(CTF,Python)