Maison  >  Article  >  développement back-end  >  Introduction à la conversion entre bases python

Introduction à la conversion entre bases python

巴扎黑
巴扎黑original
2017-08-07 17:51:261610parcourir

Cet article résume principalement les informations pertinentes pour vous permettre d'implémenter diverses conversions de base en python, y compris la conversion de chaîne et hexadécimale, la fonction intégrée hex() et la conversion de base, etc. Les amis qui en ont besoin peuvent Pour référence, prenons un regarde ci-dessous.

Avant-propos

Je rencontre souvent le problème de la conversion de base lorsque je joue à CTF, j'ai donc juste fait un résumé de la conversion de base et je l'ai partagé pour la référence de chacun. Pour apprendre, jetons un œil à l'introduction détaillée :

Conversion de chaînes et hexadécimaux

Par exemple, Baidu ctf 12 Le premier divers du deuxième jeu du mois


666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D

Un moyen plus simple est d'appeler directement le .decode('hex') décryptage de la chaîne, mais si vous ne le faites pas Je ne l'utilise pas. Comment résoudriez-vous la fonction ?

Une idée est de grouper 2 d'abord, de résoudre la valeur ascii de chaque groupe et de fusionner les chaînes pour l'obtenir. Le code spécifique est le suivant


import re
s='666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D'
s = re.findall(r'.{2}',s)
s = map(lambda x:chr(int(x,16)),s)
print ''.join(s)
>>>
flag{ec8b2ee0-3ae9-4c21-a012-08aa5fa7be67}
J'ai mentionné la fonction

pour les chaînes plus tôt, et il existe également deux fonctions pour la conversion en hexadécimal. En voici un résumé decode('hex')

Fonction intégrée hex(. )

Peut uniquement convertir des entiers décimaux en hexadécimaux, pas en chaînes

bibliothèque binascii hexlify() et b2a_hex()

La fonction de ces deux fonctions est de convertir la chaîne en hexadécimal. Les fonctions de décryptage correspondantes sont

et unhexlify()a2b_hex()

Conversion entre bases.

La conversion binaire, octale et hexadécimale en décimal est relativement simple, il suffit d'appeler la


fonction int


int(str,base) //返回十进制整数,但注意此时第一个参数为字符串
Les fonctions de décryptage correspondantes sont


bin() //10进制转二进制

oct() //十进制转八进制

hex() //十进制转十六进制
Mais il faut plus de temps pour convertir directement le binaire en hexadécimal. Allons plus loin. Utilisons d'abord int. pour convertir en décimal, puis utilisez la fonction

mentionnée ci-dessus pour convertir le décimal en hexadécimal. La façon la plus simple de l'écrire est hex()


map(lambda x:hex(int(x,2)),['0011']) //lambda表达式
ou

.


[hex(int(x,2)) for x in ['0011']] //列表解析
. La fonction de décryptage correspondante est


map(lambda x:bin(int(x,16)),['ef'])
Enfin, ajoutez-vous Un petit outil de conversion hexadécimal écrit en python. Sa fonction principale est de convertir un ensemble de nombres binaires, ou ascii, ou hexadécimaux en chaînes. Je dois souvent rencontrer ce type de question sur CTF


# make by 江sir
#coding:utf-8
import re
import argparse
 
def bintostr(text):
 text = text.replace(' ','')
 text = re.findall(r'.{8}',text)
 s = map(lambda x:chr(int(x,2)),text) #批量二进制转十进制
 flag = ''.join(s)
 return flag
 
def asciitostr(text):
 if ' ' in text:
 text = text.split(' ')
 elif ',' in text:
 text = text.split(',')
 s = map(lambda x:chr(int(x)),text)
 flag = ''.join(s)
 return flag
 
def hextostr(text):
 text = re.findall(r'.{2}',text)
 #print text
 s = map(lambda x:chr(int(x,16)),text)
 #print s
 flag = ''.join(s)
 return flag
 
 
if __name__ == '__main__':
 parser = argparse.ArgumentParser()
 parser.add_argument("-b")
 parser.add_argument("-a")
 parser.add_argument("-x")
 argv = parser.parse_args()
 #print argv
 if argv.b:
 res = bintostr(argv.b)
 elif argv.a:
 res = asciitostr(argv.a)
 elif argv.x:
 res = hextostr(argv.x)
 print res
.

Utilisation :

Hex vers chaîne :

666C61677B65633862326565302D336165392D346332312D613031322D30386161 35666137626536377D


bintostr.py -x "666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D"
flag{ec8b2ee0-3ae9-4c21-a012-08aa5fa7be67}

Conversion binaire en chaîne :

Peut avoir des espaces ou pas d'espaces

00101111 01100110 00110110 00110111 00110011 00110010 00110100 00 110001 00110000 01100001 01100001 01100100 01100011 00110000 00110011 00110111 01100110 01100010 00110000 01100011 01100010 01100001 01100001 00110000 00110000 01100011 0011011 1 00110101 00110011 0001 00110011 00110111 00110011 00101110 01110100 01111000 01110100


bintostr.py -b "00101111 01100110 00110110 00110111 00110011 00110010 00110100 00110001 00110000 01100001 01100001 01100100 01100011 00110000 00110011 00110111 01100110 01100010 00110000 01100011 01100010 01100001 01100001 00110000 00110000 01100011 00110111 00110101 00110011 00110001 00110011 00110111 00110011 00101110 01110100 01111000 01110100"
/f6732410aadc037fb0cbaa00c7531373.txt

ascii en chaîne

peut être séparé par des espaces ou séparé par

s='45 46 45 46 32 45 32 46 46 45 46 32 46 45 46 46 32 46 46 46 32 45 46 46 46 32 46 46 45 45 46 45 32 45 46 46 46 32 46 46 46 32 46 45 46 46 32'


bintostr.py -a "45 46 45 46 32 45 32 46 46 45 46 32 46 45 46 46 32 46 46 46 32 45 46 46 46 32 46 46 45 45 46 45 32 45 46 46 46 32 46 46 46 32 46 45 46 46 32"
-.-. - ..-. .-.. ... -... ..--.- -... ... .-..
Les exemples ci-dessus proviennent tous de compétitions du CTF questions

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn