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打乱顺序后的解密方式。

 

 

 

posted @ 2021-09-24 16:51  爱吃萝卜爱吃兔  阅读(1564)  评论(0编辑  收藏  举报