Python-Struct,對byte進行packing 處理

Python-Struct,對byte進行packing 處理

●Header

這輩子,沒這麼討厭a b c e d f過。

-Lambert Chen

在程式的世界裡,不同程式語言就像不同的國家,有屬於自己的語言及文法。就像Python的int,沒有定義int的範圍,要多大就多大,要正就正,要負就負。但到了C可就不同了,Unsigned int , Long , Unsigned float,每一種都有自己的邊界值。那在python中如何讓電腦看得懂不同語言,但相同的byte呢?就要依靠Struct了。

●儲存計算方式的差異

在電腦的儲存空間中,一個數值常常會被切分成4個bytes(也就是32bit),並儲存於連續的儲存空間中。每一個byte皆用16進制表示0~255(00~FF),而這些數字也像我們在用的10進制數字,會有個十百千萬,擺放的方式也些不同,有時是「萬千百十個」,有時是「個十百千萬」,這也就是電腦儲存器裡面的位元組序(Endianness)。
若電腦依照「左高右低」排序則為大端序(big-endian),反之則為小端序(little-endian)。

舉個例子 有一組數組 0x0A0B0C0D,依照端序不同有不同的儲存方式,解析時須特別注意。

Addressbig-endianlittle-endian
50000x0A0x0D
50010x0B0x0C
50020x0C0x0B
50030x0D0x0A
Endianness
CharacterByte OrderSizeAlignment
@nativenativenative
=nativestandardnone
<little-endianstandardnone
>big-endianstandardnone
!network (= big-endian)standardnone
Python Struct的endian處理符號

在Python 中使用 Struct模組時,也需特別留意端序的性質,一但端序搞混了,數值可是天壤之別呀!
馬上來看看Python如何將這些Hex透過Struct做解析吧

●Python Struct

Struct Module

Python提供了三種最常使用的方式來做Pack,Unpack。

import Struct

struct.pack(format,v1,v2)             #將python元件打包成binary package 
struct.unpack(format,buffer)          #將binary package轉成python元件
struct.calcsize(*format)              #依照format來計算需多少byte e.g. struct.calcsize('2I3s') 

F

Python對不同長度的byte分別有不同的處理字元

Pack,Unpack操作

這邊用簡單的Float,Hex互換來說明一下Pack及Unpack。
設定兩個數值 (Float:25.5 Hex:0x41cc0000),端序為小端序。
透過struct.pack()將數值打包成binary package,接著再使用struct.unpack()將binary package轉換回python 字串。

import struct

def float_to_hex(Float_num):                         
    Float_num = float(Float_num)
    return hex(struct.unpack('<I',struct.pack('<f',Float_num))[0]) #'<' little endian, 'f' 4 bytes float
def hex_to_float(Hex_num):
    return float(struct.unpack('<f',struct.pack('<I',Hex_num))[0]) #'<' little endian, 'I' 4 bytes unsigned int

print(float_to_hex(25.5))
print(hex_to_float(0x41cc0000))

●Footer

以上就是Python對於binary package的常用處理方法,對於IoT專業人員,看到這些data就是要準備和他作戰,binary的東西只要任何一點疏忽,所換來的結果可是不容小覷的,處理binary講求謹慎,Struct Module提供了更多處理binary package的function,小弟拋磚引玉,歡迎大家討論分享~

參考資料

https://docs.python.org/3/library/struct.html
https://sanyuesha.com/2018/03/10/why-pack-unpack/
https://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F

Git-使用Aliases建立別名

Git-使用Aliases建立別名

●Header

懶骨頭的Lambert最愛用Aliases建立別名啦,不僅操作Git起來少打了很多字,
更有了一種(恩~這是我專屬的Git Command呢)的優越感。
還在常常checkout、status、commit -m、log –oneline 的你還不趕快來用別
名建立自己專屬的Git Command嗎?

●Git如何建立別名呢?

很簡單,只要在CMD下Git的config即可,趕快開始做吧。

1.Command style

git config --global alias.co checkout

#使用git config --global設定
#alias.co checkout ( alias.<別名> <被取別名的Command> )

設定好之後呢,就可以使用git co來產生git check out 的功能了。
當然,較為複雜的Command也可以用別名取代!

2.More

git config --global alias.last "log -1 HEAD"

#alias.last "log -1 HEAD" ( alias.<別名> "<一串的Command>")

設定完畢之後,就不用辛辛苦苦地打git log -1 HEAD啦~
只要打上git last,Git就自動幫你秀出最後一筆log的HEAD了。
真的省了不少時間呢!

●Footer

簡單好用的Alias,輕鬆就可以使用,趕快客製化自己的Git command吧
有甚麼覺得好用的別名方式,或是有甚麼問題,也歡迎留言分享討論~

Jmeter5.2-透過代理伺服器錄製網頁腳本

Jmeter5.2-透過代理伺服器錄製網頁腳本

●Header

在網頁UI刻劃完畢,API串上後,正式上線前的必經關卡就是效能壓力測試了,
Jmeter可以輕鬆的錄製腳本,模擬虛擬用戶使用網站的情況,
便於開發人員即時反應並且處理問題,更了解正式上線前軟硬體須調整的部分,
可說是測試內不可或缺的一環。

●開始使用Jmeter錄製腳本

新版本於4.0後移除了工作台的項目,故操作起來有些許的改變,以下步驟說明如何以Jmeter建立網頁錄製腳本。

1.啟動Jmeter的Recording Template

點選1之後選擇2Recording,再Create

2.Template設定

Create後進行Template設定,設定hostToRecord及schemeToRecord
HostToRecord: http://www.google.com(錄製google為範例)
SchemeToRecord: https

設定host及scheme

3.設定瀏覽器的Proxy(代理伺服器),建議使用firefox

進入瀏覽器的進階設定頁面>連線設定 設定Proxy
將手動設定Proxy(打勾),
HTTP Proxy: localhost Port: 8888
符合Jmeter內的設定,若Port被用走需修改為其他的Port

HTTP Proxy設定

4.瀏覽器匯入Jmeter憑證

由於代理伺服器為localhost需安全性憑證來確保連線安全,Jmeter含有憑證可匯入。
Jmeter憑證存放於Jmeter安裝目錄(.\apache-jmeter-5.2.1\bin)
若搜尋不到憑證可先按一次錄製的Start按鈕(第五步驟)

點選檢視憑證
匯入該.crt憑證,確保連線安全

5.錄製前準備

先點選HTTP(S) Test Script Record(代理伺服器),設定好Target Controller(錄製到哪裡去)
點選Start即可錄製

設定Target Controller

6.開始錄製~

按下Start後,會出現Jmeter憑證通知,點選OK即可。
之後出現的小方框代表Jmeter正在紀錄目標網站的操作過程。便可以開始操作網站錄製腳本。

可以任意點按鈕,觸發API..等

7.檢視錄製結果

錄製結果將產生於Thread Group > Recording Controller下
你做了多少動作Jmeter就會幫你記錄下來
也可以進去調整你送出的API Param

錄製結果在Thread Group > Recording Controller下

●Footer

以上就是小弟如何透過Jmeter提供的代理伺服器錄製網頁腳本的過程,若瀏覽者有更好的方法,或是任何問題,都可以在下方留言一起討論討論~