python客戶端與服務端(c程式)進行通訊,需接收服務端發來的16進製製碼流,並對16進製制資料進行解碼,得到相應欄位的資料,並可以將資料打包成對應格式的碼流傳送給服務端,多位元組整數傳輸採用網路位元組序。
網路位元組順序是tcp/ip中規定好的一種資料表示格式,它與具體的cpu型別、作業系統等無關,從而可以保證資料在不同主機之間傳輸時能夠被正確解釋。網路位元組順序採用big endian(大端)排序方式。
為了同c中的結構體交換資料,還要考慮c或c++編譯器使用了位元組對齊,通常是以4個位元組為單位的32位系統,故而struct根據本地機器位元組順序轉換.可以用格式中的第乙個字元來改變對齊方式.定義如下
character byte order size alignment
@(預設) 本機 本機 本機,湊夠4位元組
= 本機 標準 none,按原位元組數
< 小端 標準 none,按原位元組數
> 大端 標準 none,按原位元組數
! network(大端) 標準 none,按原位元組數
作用:按照指定格式將python資料轉換為字串,該字串為位元組流,如網路傳輸時,不能傳輸int,此時先將int轉化為位元組流,然後再傳送;
按照指定格式將位元組流轉換為python指定的資料型別;
處理二進位制資料,如果用struct來處理檔案的話,需要用』wb』,』rb』以二進位制(位元組流)寫,讀的方式來處理檔案;
處理c語言中的結構體;
struct中兩個重要的函式:
(1)pack(fmt,v1,v2…):打包函式
返回值型別:string
按照給定的格式(fmt),把資料轉換成字串(位元組流),並將該字串返回.
(2)unpack(fmt,v1,v2…..):解包函式
返回值型別:tuple
按照給定的格式(fmt)解析位元組流,並返回解析結果
訊息採用訊息頭+訊息體格式。
uint8 1位元組 8位無符號整形
uint16 2位元組 16位無符號整形
uint32 4位元組 32位無符號整形
uint64 8位元組 64位無符號整形
1.訊息頭
字段 型別 說明
訊息編號 uint8 -
保留 uint8 用0填充
訊息體長度 uint16 不包括訊息頭的長度,範圍:0 -- 65535
1.1訊息編號
編號 訊息 用途 說明
0xe1 w_heartbeat 心跳訊息 訊息體長度為0
0xq1 query_sm 查詢sm請求 訊息體長度為0
0xq2 querysm_rpt 查詢sm資料上報
0xs1 scan_pl 掃瞄pl請求 訊息體長度為0
0xs2 scanpl_ack 掃瞄pl請求應答
1.2訊息體格式
(1)心跳訊息(w_heartbeat) 每30秒傳送一次,無訊息體
(2)query_sm 查詢sm資料請求 無訊息體
(3)querysm_rpt 查詢sm資料應答 訊息體長度為27
字段 長度 型別 說明
reserved 6 char ——
strname 16 char 字串
rs 4 int32 訊號強度(-140~-44dbm)
0:rs值無效
rs_si 1 byte 0:si
1:rs
(4)scan_pl 掃瞄pl請求 訊息體長度為0
(5)scanpl_ack 掃瞄pl請求應答
字段 長度 型別 說明
reserved 4 uint32 ——
result 2 uint16 0:成功,1:失敗
count 2 uint16 info數量
info 13 * 10 info[10] 最多10個info列表
5-1) info訊息體
字段 長度 型別 說明
id 4 uint32 id值
num 6 char 號碼
fn 2 uint16 fn頻率
power 1 uint8 功率
3.1 傳送程式(打包程式):
def th_heart():
while true:
logging.info('send w_heartbeat')
cmd_word = 0xe1
tx_buf = struct.pack('3.2 接收程式(解包程式):
if temp.find('0xq2') >=0:
logging.info('querysm_rpt')
header,b,b_len,reserved,strname,rs,rs_si = struct.unpack(">2bh6s16sib", body)
strname = strname[0:-1]
logging.info("header:%s, b:%s, b_len:%s,reserved:%s, strname:%s, rs:%s, rs_si:%s" % (header, b, b_len, reserved, strname, rs, rs_si))
sm_rpt(moduleid, strname)
if temp.find('0xs2') >= 0:
logging.info('scanpl_ack')
header, b, b_len, reserved, result, count = struct.unpack(">2bhihh", body[0:12])
id,num,fn,power = struct.unpack(">i6shb", body[12:25])
logging.info("reserved:%s, result:%s, count:%s" %(reserved,result,count))
logging.info("id:%s, num:%s, fn:%s, power:%s" % (id, num, fn, power))
pl_rpt(moduleid, id, num,fn,power)
更多部落格內容詳見我的部落格 wang's blog
Excel輸入十六進製制數,以及十六進製制運算
網上覆制來複製去的連個靠譜答案都沒有.f k 所以無奈自己探索出來了 單元格 a1文字值 a2進製值 輸入內容 fefe oct2hex hex2oct a29 由於單元格沒有提供進製格式,所以填入的值實際上是文字值,但是轉換函式卻可以把文字值視為進製值拿去轉換 所以我們兩次轉換就能得到真正的進製數...
進製轉換 十六進製制轉八進位制 十六進製制轉十進位制
在十六進製制轉為八進位制的過程中包含了將十六進製制轉化為二進位制以及將二進位制轉化為八進位制!我自己測試是沒什麼問題,但是在藍橋杯官網的測試系統就顯示執行錯誤qwq 不知道為什麼 附 include includeusing namespace std int main if len2 i 3 2 ...
十六進製制位元組 十六進製制轉二進位制
做專案也將近一年的時間了。從一開始就經常提到 乙個十六進製制位元組 然而一開始就是迷惑的,直到現在。乙個十六進製制位元組,比如 ff。周圍的人經常說這是乙個十六進製制位元組。然後我就想,這不是兩個字元嗎,分別是f 和f,乙個字元是乙個位元組,兩個字元是兩個位元組,怎麼就成乙個十六進製制位元組,就成乙...