16進制節碼解析


16進制節碼解析

前言:

  之前我們介紹了modbus_tk數據傳輸,當然只是介紹了最基本的modbus_tk使用方法,

  在使用時我們常用”16進制節碼“傳輸內容今天就簡單介紹一個16進制節碼解析的實例

從機:float形式數據

 

主機:

python:modbus_tk

import modbus_tk.modbus_tcp as mt
import modbus_tk.defines as md
import struct


# 浮點數轉換
def int2float(a, b):
    f = 0
    try:
        z0 = hex(a)[2:].zfill(4)  # 取0x后邊的部分 右對齊 左補零
        z1 = hex(b)[2:].zfill(4)  # 取0x后邊的部分 右對齊 左補零
        z = z0 + z1  # 高字節在前 低字節在后  ABCD型16進制編碼數據
        z = z1 + z0  # 高字節在前 低字節在后 CDAB型16進制編碼數據
        z = hex(a)[2:][2:] + hex(a)[2:][:2] + hex(b)[2:][2:] + hex(b)[2:][:2]  # BACD型16進制編碼數據
        z = hex(b)[2:][2:] + hex(b)[2:][:2] + hex(a)[2:][2:] + hex(a)[2:][:2]  # DCBA型16進制編碼數據

        f = struct.unpack('!f', bytes.fromhex(z))[0]  # 返回浮點數
    except BaseException as e:
        print(e)
    return f


def register_network(ip='192.168.0.105', host=502):
    # 遠程連接到服務器端
    # "192.168.0.105", 502
    master = mt.TcpMaster(ip, host)
    master.set_timeout(2)

    # @slave=1 : identifier of the slave. from 1 to 247.  0為廣播所有的slave
    # @function_code=READ_HOLDING_REGISTERS:功能碼
    # @starting_address=1:開始地址
    # @quantity_of_x=3:寄存器/線圈的數量
    # @output_value:一個整數或可迭代的值:1/[1,1,1,0,0,1]/xrange(12)
    # @data_format
    # @expected_length
    Hold_value = master.execute(slave=1, function_code=md.READ_HOLDING_REGISTERS, starting_address=0, quantity_of_x=10,
                                output_value=5)
    print(Hold_value)
    Hold_value_list = [install for install in Hold_value]
    int2float(Hold_value_list[0], Hold_value_list[1])
    Hold_value_list[0] = float('%.2f' % int2float(Hold_value_list[0], Hold_value_list[1]))  
    print(Hold_value_list[0])


register_network()

當主機從從機采集數據時默認float形數據,從機會以ABCD四字節划分數據未,以打亂ABCD四字節的順序而達到加密等目的

以上實例中”Z“變量就是當ABCD打亂順序后的解密方式。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM