Maison  >  Article  >  développement back-end  >  Un résumé de la façon dont Python implémente diverses conversions hexadécimales

Un résumé de la façon dont Python implémente diverses conversions hexadécimales

黄舟
黄舟original
2017-06-18 11:00:532197parcourir

Cet article résume principalement les informations pertinentes permettant à Python d'implémenter diverses conversions de base, y compris la chaîne et la conversion hexadécimale, et les fonctions intégréesHex() et la conversion hexadécimale et d'autres contenus connexes, les amis dans le besoin peuvent s'y référer, jetons un coup d'œil 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 commencer par le groupe 2 , 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. Voici un résumé de la decode('hex')

. la fonction intégrée hex ()

ne peut convertir que des entiers décimaux en hexadécimal, pas des 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 respectivement

et unhexlify()a2b_hex()Conversion entre bases

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


sont respectivement


int(str,base) //返回十进制整数,但注意此时第一个参数为字符串

mais le binaire est converti directement en hexadécimal nécessite une étape de plus. Utilisez 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 méthode d'écriture la plus simple est

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

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

hex() //十进制转十六进制

hex()

ou


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

. La fonction de décryptage correspondante est


[hex(int(x,2)) for x in ['0011']] //列表解析

Enfin, je joins une petite conversion hexadécimale. outil que j'ai écrit en python. Sa fonction principale est de convertir un ensemble de binaires, ou ascii, ou hexadécimaux en chaînes. J'ai dû souvent rencontrer ce type de question sur Bar


.
map(lambda x:bin(int(x,16)),['ef'])

Utilisation :


# 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
Hex en chaîne :

3bb3ba5d8a8c1e677360c9d603cb067b 🎜>

Conversion binaire en chaîne :


peut aussi avoir des espaces Peut être sans espaces

00101111 01100110 00110110 00110111 00110011 00110010 00110100 00110001 00110000 01100001 01100001 0110010 0 01100011 00110000 00110011 00110111 01100110 01100010 00110000 01100011 01100010 01100001 01100001 00110000 00110000 01100 011 00110111 00110101 00110011 00110001 00110011 00110111 00110011 00101110 0111 0100 01111000 01110100


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

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 4 6 32 46 45 46 46 32'


Les exemples ci-dessus proviennent tous de certaines questions du concours CTF

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

Résumé

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