>  기사  >  백엔드 개발  >  파이썬 베이스 간 변환 소개

파이썬 베이스 간 변환 소개

巴扎黑
巴扎黑원래의
2017-08-07 17:51:261568검색

이 글은 문자열 및 16진수 변환, 내장 함수 hex() 및 기본 변환 등 다양한 기본 변환을 구현하기 위해 Python에 대한 관련 정보를 주로 요약합니다. 필요한 친구는 아래를 참조하세요. .

머리말

CTF를 플레이할 때 염기 변환 문제를 자주 접하게 되어, 그냥 염기 변환 요약을 만들어 모두가 참고하고 공부할 수 있도록 공유했습니다. 자세한 소개를 살펴보겠습니다.

문자 문자열 및 16진수 변환

예를 들어 12월 Baidu ctf 두 번째 세션의 첫 번째 기타


666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D

더 간단한 방법은 문자열의 .decode(' hex ')를 복호화할 수 있는데, 이 기능을 사용하지 않는다면 어떻게 복호화할 수 있을까요? .decode('hex')解密即可, 但如果不用这个函数你会怎么解呢?

一种思路就是先2个分组,解出每组的ascii值,合并下字符串即可得到,具体代码如下


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}

前面说了字符串的decode('hex')函数,另外还有两个转16进制的函数,这里都总结一下

内置函数hex()

只能转换10进制整数为十六进制,不能转字符串

binascii库的hexlify()和b2a_hex()

这两个函数的功能是将字符串转换成十六进制,对应的解密函数分别为 unhexlify()a2b_hex()

进制互转

二进制,八进制,十六进制转10进制比较简单,直接调用

int函数


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

对应的解密函数分别是


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

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

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

但二进制直接转16进制就需要多走一步了,先用int转十进制,在用上面提到的hex()

한 가지 아이디어는 먼저 그룹 2를 구성하고 각 그룹의 ASCII 값을 풀고 문자열을 병합하여 구하는 것입니다. 구체적인 코드는 다음과 같습니다.


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

decode('hex''에 대해 언급했습니다. 이전 문자열) ) 함수와 16진수로 변환하는 두 가지 다른 함수가 있습니다. 여기에 요약해 보겠습니다.


내장 함수 hex()


는 10진수 정수를 16진수로만 변환할 수 있습니다. . 문자열을 변환할 수 없습니다


binascii 라이브러리 hexlify() 및 b2a_hex()

이 두 함수의 기능은 문자열을 16진수로 변환하는 것이며 해당 해독 함수는 unhexlify() a2b_hex()

conversion

2진수, 8진수, 16진수를 10진수로 변환하는 것은 상대적으로 간단하며

int 함수를 직접 호출합니다.

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

의 해당 복호화 함수

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

하지만 2진수를 16진수로 직접 변환하려면 먼저 int를 사용하여 10진수로 변환한 다음 위에서 언급한 hex() 함수를 사용하세요. 10진수를 16진수로 변환하는 방법은

# 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
또는

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

입니다. 마지막으로 제가 직접 사용하기 위해 첨부합니다. Python으로 작성된 도구의 주요 기능은 바이너리, ASCII 또는 16진수 집합을 문자열로 변환하는 것입니다. 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

Usage:🎜🎜🎜🎜Hex에서 이러한 유형의 질문을 자주 접하게 됩니다. : 6666c61677b65633862326565302d336165392d34633232312d61303132d3038616135666613762 6536377d🎜🎜🎜🎜r
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"
-.-. - ..-. .-.. ... -... ..--.- -... ... .-..
e -binary to space 001111111111111111111111111111111111111111111111111111111111111111111111111111111111111 미까지까지 00110111 00110011 00110010 00110100 00110001 00110000 01100001 01100001 01100100 01100011 00110000 00110011 00110111 01100110 01100 010 00110000 01100011 01100010 01100001 01100001 00110000 00110000 01100011 00110111 00110101 00110011 00110001 00110011 001 0111 00110011 00101110 01110100 01111000 01110100🎜🎜🎜🎜rrreee🎜🎜ascii에서 string🎜🎜🎜🎜으로 공백으로 구분할 수 있으며 🎜🎜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'🎜🎜🎜 🎜rrreee🎜위의 예는 모두 일부 CTF 경쟁 질문에서 나온 것입니다🎜

위 내용은 파이썬 베이스 간 변환 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.