當前位置:首頁 » 編程語言 » python表示二進制

python表示二進制

發布時間: 2023-11-22 01:06:33

1. python struct pack怎麼弄成二進制

有的時候需要用python處理二進制數據,比如,存取文件,socket操作時.這時候,可以使用python的struct模塊來完成.可以用 struct來處理c語言中的結構體.
struct模塊中最重要的三個函數是pack(), unpack(), calcsize()
8

# 按照給定的格式(fmt),把數據封裝成字元串(實際上是類似於c結構體的位元組流)pack(fmt, v1, v2, ...) # 按照給定的格式(fmt)解析位元組流string,返回解析出來的tupleunpack(fmt, string) # 計算給定的格式(fmt)佔用多少位元組的內存calcsize(fmt)

上述fmt中,支持的格式為:

FORMAT
C TYPE
PYTHON TYPE
STANDARD SIZE
NOTES

x pad byte no value
c char string of length 1 1
b signed char integer 1 (3)
B unsigned char integer 1 (3)
? _Bool bool 1 (1)
h short integer 2 (3)
H unsigned short integer 2 (3)
i int integer 4 (3)
I unsigned int integer 4 (3)
l long integer 4 (3)
L unsigned long integer 4 (3)
q long long integer 8 (2), (3)
Q unsigned long long integer 8 (2), (3)
f float float 4 (4)
d double float 8 (4)
s char[] string
p char[] string
P void * integer (5), (3)
注1.q和Q只在機器支持64位操作時有意思
注2.每個格式前可以有一個數字,表示個數
注3.s格式表示一定長度的字元串,4s表示長度為4的字元串,但是p表示的是pascal字元串
注4.P用來轉換一個指針,其長度和機器字長相關
注5.最後一個可以用來表示指針類型的,佔4個位元組
為了同c中的結構體交換數據,還要考慮有的c或c++編譯器使用了位元組對齊,通常是以4個位元組為單位的32位系統,故而struct根據本地機器位元組順序轉換.可以用格式中的第一個字元來改變對齊方式.定義如下:

CHARACTER
BYTE ORDER
SIZE
ALIGNMENT

@ native native native
= native standard none
< little-endian standard none
> big-endian standard none
! network (= big-endian) standard none
使用方法是放在fmt的第一個位置,就像』@5s6sif』
例子1:
結構體如下:

structHeader{ unsigned shortid; char[4] tag; unsigned intversion; unsigned intcount;}

通過socket.recv接收到了一個上面的結構體數據,存在字元串s中,現在需要把它解析出來,可以使用unpack()函數:

importstructid, tag, version, count =struct.unpack("!H4s2I", s)

上面的格式字元串中,!表示我們要使用網路位元組順序解析,因為我們的數據是從網路中接收到的,在網路上傳送的時候它是網路位元組順序的.後面的H表示 一個unsigned short的id,4s表示4位元組長的字元串,2I表示有兩個unsigned int類型的數據.
就通過一個unpack,現在id, tag, version, count里已經保存好我們的信息了.
同樣,也可以很方便的把本地數據再pack成struct格式:

ss =struct.pack("!H4s2I", id, tag, version, count);

pack函數就把id, tag, version, count按照指定的格式轉換成了結構體Header,ss現在是一個字元串(實際上是類似於c結構體的位元組流),可以通過 socket.send(ss)把這個字元串發送出去。
例子2:

importstruct a=12.34 # 將a變為二進制bytes=struct.pack('i',a)

此時bytes就是一個string字元串,字元串按位元組同a的二進制存儲內容相同。
再進行反操作,現有二進制數據bytes,(其實就是字元串),將它反過來轉換成python的數據類型:

# 注意,unpack返回的是tuple !!a,=struct.unpack('i',bytes)

如果是由多個數據構成的,可以這樣:

a='hello'b='world!'c=2d=45.123 bytes=struct.pack('5s6sif',a,b,c,d)

此時的bytes就是二進制形式的數據了,可以直接寫入文件比如 binfile.write(bytes)
然後,當我們需要時可以再讀出來,bytes=binfile.read()
再通過struct.unpack()解碼成python變數:

a,b,c,d=struct.unpack('5s6sif',bytes)

』5s6sif』這個叫做fmt,就是格式化字元串,由數字加字元構成,5s表示佔5個字元的字元串,2i,表示2個整數等等,下面是可用的字元及類型,ctype表示可以與python中的類型一一對應。
注意:二進制文件處理時會碰到的問題
我們使用處理二進制文件時,需要用如下方法:

binfile=open(filepath,'rb') #讀二進制文件 binfile=open(filepath,'wb') #寫二進制文件

那麼和binfile=open(filepath,』r')的結果到底有何不同呢?
不同之處有兩個地方:
第一,使用』r'的時候如果碰到』0x1A』,就會視為文件結束,這就是EOF。使用』rb』則不存在這個問題。即,如果你用二進制寫入再用文本讀出的話,如果其中存在』0X1A』,就只會讀出文件的一部分。使用』rb』的時候會一直讀到文件末尾。
第二,對於字元串x=』abc\ndef』,我們可用len(x)得到它的長度為7,\n我們稱之為換行符,實際上是』0X0A』。當我們用』w'即文本方式寫的時候,在windows平台上會自動將』0X0A』變成兩個字元』0X0D』,』0X0A』,即文件長度實際上變成8.。當用』r'文本方式讀取時,又自動的轉換成原來的換行符。如果換成』wb』二進制方式來寫的話,則會保持一個字元不變,讀取時也是原樣讀取。所以如果用文本方式寫入,用二進制方式讀取的話,就要考慮這多出的一個位元組了。』0X0D』又稱回車符。linux下不會變。因為linux只使用』0X0A』來表示換行。

2. 求教如何Python十進制小數和二進制小數相互轉換的實現方式,用代碼表示出來,謝謝

  • 從二進制轉換為十進制有幾種方式第一種是在二進制數前加上0b,顯示時會自動轉換為十進制,注意這並不是字元串
    x
    =
    0b1010print(x)
    如果是字元串可以利用eval求值
    x
    =
    eval('0b1010')
    第二種是利用int函數,字元串可以以0b為前綴,也可以不使用
    int('1010',base=2)int('0b1010',2)
    函數會將輸入base進制的字元串轉換為十進制

3. 如何用python生成和讀取二進制文件

可以使用numpy.fromfile(),也可以使用open(filename,
'rb'),其中的'b'就是二進制的意思,然後使用文件類型的read方法,讀取一些字zd節,再用struct.unpack()方法來解析二進制。
第一種方法是一次性讀入文件(或文件的內前多少個連續位元組)到一個數組中,因此,靈活性差。
第二容種方法靈活性很高,可以讀取任意位置(使用文件的seek()方法跳躍位置)的二進制數據,再使用struct.unpack()方法來進行各種二進制解析。
提示:二進制文件是不保留存儲方式的數據格式,因此,讀二進制文件時應該知道二進制文件的存儲格式。

4. python怎麼處理二進制流

可以的,二進制是計算機內的表示方法,處理二進制數據是最基本的能力。
如果是二進制字元串轉十進制:
>>>
x
=
'10101010'
>>>
int(x,
2)
170
如果是從文件或網路中獲取的數據,要知道某一位是0還是1的話,獲取的數據可以按字元讀取,由於一個字元由8位二進製表示,分別讀取1到8位的二進制值就可以了:
>>>
get_char_bit
=
lambda
char,
n:
(char
>>
(8-n))
&
1
#
從高到低分別為第1~8位
>>>
data
=
b'ab'
#
在python3中字元串默認是unicode,所以加上b前綴兼容
>>>
#
在python3中按字元讀取byte字元串是數字,而python2讀出來的卻是字元,但bytearray是一致的都是數字
>>>
data
=
bytearray(data)
>>>
result
=
[]
>>>
for
char
in
data:
for
i
in
range(1,
9):
result.append(get_char_bit(char,
i))
>>>
result
[0,
1,
1,
0,
0,
0,
0,
1,
0,
1,
1,
0,
0,
0,
1,
0]

5. 如何在python中用數值轉換輸出int型128的二進製表示,八進製表示,十進製表示,十六進製表示

b、d、o、x 分別是二進制、十進制、八進制、十六進制。

例如,把123以二進制輸出:

print ("{:b}".format(123))

6. 如何用Python將十進制數字轉為二進制,以及將二進制轉為十六進制

1、將十進制轉換成二進制,利用bin()方法。

7. python輸入一個三位數 輸出百位十位個位數字的二進制數

s = 123
for i in list(str(s)):

print(bin(int(i)))

8. python整數轉化為二進制

1、你可以自己寫函數採用 %2 的方式來算。
>>> binary = lambda n: '' if n==0 else binary(n/2) + str(n%2)>>> binary(5)'101'>>>

2、採用 python 自帶了方法 bin 函數,比如 bin(12345) 回返回字元串 '0b11000000111001', 這個時候在把0b去掉即可:
>>> bin(12345).replace('0b','')'11000000111001'

3、也可以採用字元串的 format 方法來獲取二進制:
>>> "{0:b}".format(12345)'11000000111001'>>>

熱點內容
sql存儲過程返回多個結果 發布:2025-01-28 03:24:03 瀏覽:462
長安歐尚科賽哪個配置值得購買 發布:2025-01-28 03:19:35 瀏覽:115
c全排列演算法 發布:2025-01-28 03:18:16 瀏覽:753
梵蒂岡頂級時裝ftp 發布:2025-01-28 03:03:36 瀏覽:694
手游腳本有前途嗎 發布:2025-01-28 02:46:55 瀏覽:378
抓包編程 發布:2025-01-28 02:42:41 瀏覽:929
安卓平板上怎麼設置熱點 發布:2025-01-28 02:36:33 瀏覽:717
如何在手機上壓縮圖片 發布:2025-01-28 02:34:09 瀏覽:989
伺服器ip掛上公網 發布:2025-01-28 02:31:15 瀏覽:978
吃雞配置需要什麼條件 發布:2025-01-28 02:26:15 瀏覽:9