在學習python測試指令碼的時候,碰到乙個struct.pack(fmt, v1, v2, ...),是關於位元組序轉換的,順便了解了一下位元組序。
首先介紹一下 struct.pack():
struct.apck用於將python的值根據格式符,轉換為字串(因為python中沒有位元組(byte)型別,這裡的字串可理解為位元組流,或位元組陣列),其函式原型為:struct.pack(fmt, v1, v2, ...),其中引數fmt是格式字串(python中的格式字串參考下文strcut型別表),v1, v2, ... 代表要轉換的python值。
示例如圖:
1.計算機硬體有兩種儲存資料的方式:大端位元組序(big endian)和小端位元組序(little endian)。
舉例來說,數值0x2211
使用兩個位元組儲存:高位位元組是0x22
,低位位元組是0x11
。
同理,0x1234567
的大端位元組序和小端位元組序的寫法如下圖。
2.我一直不理解,為什麼要有位元組序,每次讀寫都要區分,多麻煩!統一使用大端位元組序,不是更方便嗎?
上週,我讀到了一篇文章,解答了所有的疑問。而且,我發現原來的理解是錯的,位元組序其實很簡單。
3.首先,為什麼會有小端位元組序?
答案是,計算機電路先處理低位位元組,效率比較高,因為計算都是從低位開始的。所以,計算機的內部處理都是小端位元組序。
但是,人類還是習慣讀寫大端位元組序。所以,除了計算機的內部處理,其他的場合幾乎都是大端位元組序,比如網路傳輸和檔案儲存。
4.計算機處理位元組序的時候,不知道什麼是高位位元組,什麼是低位位元組。它只知道按順序讀取位元組,先讀第乙個位元組,再讀第二個位元組。
如果是大端位元組序,先讀到的就是高位位元組,後讀到的就是低位位元組。小端位元組序正好相反。
理解這一點,才能理解計算機如何處理位元組序。
5.位元組序的處理,就是一句話:
"只有讀取的時候,才必須區分位元組序,其他情況都不用考慮。"處理器讀取外部資料的時候,必須知道資料的位元組序,將其轉成正確的值。然後,就正常使用這個值,完全不用再考慮位元組序。
即使是向外部裝置寫入資料,也不用考慮位元組序,正常寫入乙個值即可。外部裝置會自己處理位元組序的問題。
6.舉例來說,處理器讀入乙個16位整數。如果是大端位元組序,就按下面的方式轉成值。
上面**中,x = buf[offset]
*256
+ buf[offset+1]
;
buf
是整個資料塊在記憶體中的起始位址,offset
是當前正在讀取的位置。第乙個位元組乘以256,再加上第二個位元組,就是大端位元組序的值,這個式子可以用邏輯運算子改寫。
上面**中,第乙個位元組左移8位(即後面添8個x = buf[offset]
<
<
8| buf[offset+1]
;
0
),然後再與第二個位元組進行或運算。
如果是小端位元組序,用下面的公式轉成值。
32位整數的求值公式也是一樣的。x = buf[offset+1]
*256
+ buf[offset]
;
補充部分:/* 大端位元組序 */
i =(data[3]
<
<0)
|(data[2]
<
<8)
|(data[1]
<
<16)
|(data[0]
<
<24)
;/* 小端位元組序 */
i =(data[0]
<
<0)
|(data[1]
<
<8)
|(data[2]
<
<16)
|(data[3]
<
<24)
;
在python中,位元組序的代表符號:
1. @ :本機位元組序,本機,本機4位元組對齊
2. = :本機位元組序,標準,按原位元組數對齊
3. 4. > : 大尾位元組序,標準,按原位元組數對齊
5. ! : 網路位元組序(大尾),標準,按原位元組對齊
6. 預設 : 使用本機位元組序(同@)
本次主要用到了 >i 和 i 代表大字節序 unsinged int ,python strut模組的型別表如下表所示:
format
c type
python type
standard size
notes
xpad byte
no value
cchar
string of length 11b
signed char
integer
1(3)
bunsigned char
integer
1(3)
?_bool
bool
1(1)
hshort
integer
2(3)
hunsigned short
integer
2(3)
iint
integer
4(3)
iunsigned int
integer
4(3)
llong
integer
4(3)
lunsigned long
integer
4(3)
qlong long
integer
8(2), (3)
qunsigned long long
integer
8(2), (3)
ffloat
float
4(4)
ddouble
float
8(4)
schar
string1p
char
string
pvoid *
integer
(5), (3)
理解位元組序
日期 2016年11月22日 1.計算機硬體有兩種儲存資料的方式 大端位元組序 big endian 和小端位元組序 little endian 舉例來說,數值0x2211使用兩個位元組儲存 高位位元組是0x22,低位位元組是0x11。同理,0x1234567的大端位元組序和小端位元組序的寫法如下圖...
理解位元組序
1.計算機硬體有兩種儲存資料的方式 大端位元組序 big endian 和小端位元組序 little endian 舉例來說,數值0x2211使用兩個位元組儲存 高位位元組是0x22,低位位元組是0x11。同理,0x1234567的大端位元組序和小端位元組序的寫法如下圖。2.我一直不理解,為什麼要有...
理解位元組序
計算機硬體有兩種儲存資料的方式 大端位元組序 big endian 和小端位元組序 little endian 舉例來說,數值0x2211使用兩個位元組儲存 高位位元組是0x22,低位位元組是0x11。大端位元組序 高位位元組在前,低位位元組在後,這是人類讀寫數值的方法。小端位元組序 低位位元組在前...