新聞中心
怎樣用python進行二進制,八進制,十進制轉換
從二進制轉換為十進制有幾種方式
成都創(chuàng)新互聯(lián)是工信部頒發(fā)資質IDC服務器商,為用戶提供優(yōu)質的成都溫江機房服務
第一種是在二進制數(shù)前加上0b,顯示時會自動轉換為十進制,注意這并不是字符串
x = 0b1010print(x)
如果是字符串可以利用eval求值
x = eval('0b1010')
第二種是利用int函數(shù),字符串可以以0b為前綴,也可以不使用
int('1010',base=2)int('0b1010',2)
函數(shù)會將輸入base進制的字符串轉換為十進制
關于python如何實現(xiàn)各進制轉換的總結大全
ctf經(jīng)常遇到進制轉換的問題,就正好做一個進制轉換總結,分享出來供大家參考學習,下面來一起看看詳細的介紹:
字符串與十六進制轉換
例如百度ctf 12月的第二場第一個misc
?
1
666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D
比較簡單的一種做法就是直接調用字符串的.decode('hex')解密即可, 但如果不用這個函數(shù)你會怎么解呢?
一種思路就是先2個分組,解出每組的ascii值,合并下字符串即可得到,具體代碼如下
?
1234567
import res='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')函數(shù),另外還有兩個轉16進制的函數(shù),這里都總結一下
內置函數(shù)hex()
只能轉換10進制整數(shù)為十六進制,不能轉字符串
binascii庫的hexlify()和b2a_hex()
這兩個函數(shù)的功能是將字符串轉換成十六進制,對應的解密函數(shù)分別為 unhexlify()和a2b_hex()
進制互轉
二進制,八進制,十六進制轉10進制比較簡單,直接調用
int函數(shù)
?
1
int(str,base) //返回十進制整數(shù),但注意此時第一個參數(shù)為字符串
對應的解密函數(shù)分別是
?
12345
bin() //10進制轉二進制 oct() //十進制轉八進制 hex() //十進制轉十六進制
但二進制直接轉16進制就需要多走一步了,先用int轉十進制,在用上面提到的hex()函數(shù)將十進制轉換成十六進制,比較精簡的寫法是
?
1
map(lambda x:hex(int(x,2)),['0011']) //lambda表達式
或者是
?
1
[hex(int(x,2)) for x in ['0011']] //列表解析
對應的解密函數(shù)就是
?
1
map(lambda x:bin(int(x,16)),['ef'])
最后在附上自己用python寫的一個進制轉換小工具,主要功能是對一組二進制,或者ascii,或十六進制轉換成字符串,想必ctf上也經(jīng)常會遇到這類題型吧
?
1234567891011121314151617181920212223242526272829303132333435363738394041424344
# make by 江sir#coding:utf-8import reimport 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
用法:
十六進制轉字符串:
666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D
?
12
bintostr.py -x "666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D"flag{ec8b2ee0-3ae9-4c21-a012-08aa5fa7be67}
二進制轉字符串:
可以有空格,也可以無空格
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
?
12
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轉字符串
可以是空格分隔,也可以是,分隔
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'
?
12
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"-.-. - ..-. .-.. ... -... ..--.- -... ... .-..
以上實例均來自某些ctf賽題
總結
python中的進制轉換和原碼,反碼,補碼
python中的進制轉換和原碼,反碼,補碼
計算機文件大小單位
b = bit 位(比特)
B = Byte 字節(jié)
1Byte = 8 bit #一個字節(jié)等于8位 可以簡寫成 1B = 8b
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
1PB = 1024TB
1EB = 1024PB
進制分類
二進制:由2個數(shù)字組成,有0 和 1 python中標志:0b
八進制:由8個數(shù)字組成,有0,1,2,3,4,5,6,7 python中標志:0o
十進制:有10個數(shù)字組成,有0,1,2,3,4,5,6,7,8,9 python中標志:無
十六進制:有16個數(shù)字組成,有0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f(進制字母大小寫都可以,分別代表10,11,12,13,14,15) python中標志:0x
python中的進制轉換:
其他進制轉換為十進制:int(相應進制)
其他進制轉換為二進制:bin(相應進制)
其他進制轉換為八進制:oct(相應進制)
其他進制轉換為十六進制:hex(相應進制)
二進制 轉化成 十進制:
例: 0b10100101
運算:1* 2^0 + 0* 2^1 + 1* 2^2 + 0* 2^3 + 0* 2^4 + 1* 2^5 + 0* 2^6 + 1* 2^7=
1 + 0 + 4 + 0 + 0 + 32 + 0 + 128 = 165
八進制 轉化成 十進制:
例: 0o127
運算:7*8^0 + 2*8^1 + 1*8^2 = 7+16+64 = 87
十六進制 轉化成 十進制:
例: 0xff
運算:15*16^0 + 15*16^1 = 255
十進制 轉化成 二進制:
426 = 0b110101010
運算過程: 用426除以2,得出的結果再去不停地除以2,
直到除完最后的結果小于2停止,
在把每個階段求得的余數(shù)從下到上依次拼接完畢即可
十進制 轉化成 八進制:? ?
426 = 0o652
運算過程: 用426除以8,得出的結果再去不停地除以8,
直到除完最后的結果小于8停止,
在把每個階段求得的余數(shù)從下到上依次拼接完畢即可
十進制 轉化成 十六進制:? ?
運算過程: 用426除以16,得出的結果再去不停地除以16,
直到除完最后的結果小于16停止,
在把每個階段求得的余數(shù)從下到上依次拼接完畢即可。
相關推薦:《Python視頻教程》
原碼,反碼,補碼
實際人們看到的數(shù)字是原碼轉化之后顯示出來的。
而原碼是通過補碼得到的。
計算機的所有數(shù)據(jù)在底層都是以二進制的補碼形式存儲。
***進制轉換的時候需要先把內存存儲的補碼拿出來變成原碼在進行轉換輸出***
反碼:二進制碼0變1,1變0叫做反碼,反碼用于原碼補碼之間的轉換。
補碼:用來做數(shù)據(jù)的存儲運算,可以實現(xiàn)計算機底層的減法操作,因而提出(可以表達出一個數(shù)的正負)。
也就是說默認計算機只會做加法,例:5+(-3) = 5 - 3。
乘法除法是通過左移和右移 來實現(xiàn)。
正數(shù)高位補0,負數(shù)高位補1。
正數(shù):
原碼 = 反碼 = 補碼
負數(shù):
反碼 = 原碼取反(除高位)
補碼 = 反碼加1
反碼 = 補碼減1
原碼 = 反碼取反(除高位)
我們會發(fā)現(xiàn),在取反前減1和在取反后加1的效果是一樣的,這就和-2-1 = -(2+1)一個道理,所以會得出這樣的規(guī)律:
原碼 = 補碼取反加1
補碼 = 原碼取反加1
一個數(shù)在計算機中的二進制表示形式, 叫做這個數(shù)的機器數(shù)。機器數(shù)是帶符號的,在計算機用一個數(shù)的最高位存放符號, 叫符號位正數(shù)為0, 負數(shù)為1。
比如
正數(shù)1在計算機中的存儲即為
0 00000000000000000000001
負數(shù)1 在計算機中的存儲即為
1 00000000000000000000001
一個正數(shù),轉換為二進制位就是這個正數(shù)的原碼。負數(shù)的絕對值轉換成二進制位然后在高位補1就是這個負數(shù)的原碼。
正數(shù)的反碼就是原碼,負數(shù)的反碼等于原碼除符號位以外所有的位取反。
正數(shù)的補碼與原碼相同,負數(shù)的補碼為 其原碼除符號位外所有位取反(得到反碼了),然后最低位加1。
所以原碼,反碼,補碼正數(shù)情況下是一致的,負數(shù)情況下是不一致的。
計算機的運算過程實際就是補碼相加的一個過程。
比如-2 + 3
-2 的原碼為
1 000000000000000000000000010
反碼為:
1 111111111111111111111111101
補碼為:
1 111111111111111111111111110
3的原碼為
0 000000000000000000000000011
反碼為:
0 000000000000000000000000011
補碼為:
0 000000000000000000000000011
那么二者補碼相加結果為
1 111111111111111111111111110
+
0 000000000000000000000000011
=
10 000000000000000000000000001(計算機存儲為32位,故前面溢出的1被舍棄,高位為0)
0 000000000000000000000000001
結果為1
再比如-2 + 1
-2 的原碼為
1 000000000000000000000000010
反碼為:
1 111111111111111111111111101
補碼為:
1 111111111111111111111111110
1的原碼為
0 000000000000000000000000001
1的反碼為:
0 000000000000000000000000001
1的補碼為:
0 000000000000000000000000001
二者的補碼相加結果為
1 111111111111111111111111110
+
0 000000000000000000000000001
=
1 111111111111111111111111111
得出的補碼轉化為原碼, 最低位減一得到反碼,然后除符號位外所有位取反,得到結果
1 000000000000000000000000001
結果為1
急求急求啊啊 Python--編寫下列程序。 用戶輸入一段字符串,將該字符串轉化為八進制十六進制.
python
1?轉為八進制使用oct()函數(shù)
2 轉為十六進制使用hex()函數(shù)
a?=?int(input())
print(oct(a))
print(hex(a))
python怎么將字符串轉化為八位二進制
這是我寫的一段程序,可以實現(xiàn)將字符串轉為二進制。
基本思路:
1,將一個字符串轉換為字符。這里采用了迭代器__iter__()內置函數(shù),即可實現(xiàn)這個方法
2,將每一個字符轉換為十進制,再轉化為二進制。bin()函數(shù)只能將一個十進制函數(shù)轉換為二進制,ord()函數(shù)可以將一個字符轉換為十進制(實質就是這個字符的unicode編號),如此就實現(xiàn)了不同計數(shù)方法之間的轉化
當前標題:python轉八進制函數(shù) python 八進制函數(shù)
URL標題:http://fisionsoft.com.cn/article/hjidoi.html