【问题标题】:Negative value prints as big number in python负值在python中打印为大数字
【发布时间】:2022-10-26 03:04:33
【问题描述】:

我从 modbusTCP 服务器中提取数据,但是当我应该收到一个负值时,它显示为一个大数字。

self.export = self.c.read_holding_registers(37113, 2)[1]

我知道这与签名或未签名有关,但我真的很难解决它。

    print("export:      " + "{:02f}W".format(self.inverter.export))
    print("exportBytes: " + "{:16b}W".format(self.inverter.export))
    print("export:      " + "{:02f}W".format(self.inverter.export))
    print("export 1:    " + "{:16b}W".format(1))
    print("export-1:    " + "{:16b}W".format(-1))

打印出来

export:      59142.000000kW
exportBytes: 1110011100000110kW
export:      59142.000000kW
export 1:                   1kW
export-1:                  -1kW

有什么猜测吗?

【问题讨论】:

  • type(self.inverter.export) 返回什么?
  • 它返回 <class 'int'>
  • 你如何从modbusTCP 获取数据?如果您将其作为字节获取,那么也许您应该使用struct 将其转换为整数。或者,也许您应该编写自己的函数将其转换为整数。

标签: python unsigned pymodbustcp


【解决方案1】:

接收到的字节被隐式地转换为无符号整数。

要转换为有符号整数,我们

  1. 使用 Int.to_bytes() 获取字节和
  2. 使用 int.from_bytes() 获取 signet int。
    varBytes = theInteger.to_bytes(2, 'big')                               # getting raw bytes
    signedInt = int.from_bytes(varBytes , byteorder='big', signed = True)  # getting signet int vale
    

    复制到一个int作为无符号。接收到的“int”被python隐式转换为一个int。

【讨论】:

    【解决方案2】:

    我认为 Mads 的解决方案会起作用,但这可能更能说明正在发生的事情:

    def int16_decode(uint16_val):
        if uint16_val > 0x8000:
            uint16_val -= 0x10000
        return uint16_val
    

    这就是有符号整数在内存中的存储方式。 int16 与 uint16 类似,但最高有效位保留为符号位。因此,如果您将负 int16 读取为 uint16,它将非常大,因为 16 的最高有效位是 1。

    【讨论】:

      猜你喜欢
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 2019-10-17
      • 1970-01-01
      相关资源
      最近更新 更多