Java 如何组合三个连续Modbus寄存器以获得整数值?

Java 如何组合三个连续Modbus寄存器以获得整数值?,java,type-conversion,modbus,Java,Type Conversion,Modbus,我必须使用Modbus协议读取设备的值。它有一个6字节长的值,由三个连续的保持寄存器表示。这是有符号和无符号类型的图形表示 我可以使用Java中的Modbus库读取三个寄存器。每个寄存器读取为2字节的短值。现在我需要知道如何组合这三个值以形成有符号和无符号格式的整数值?请记住,我已经很久没有编写java了,所以我的java非常生疏。因为Java中没有无符号值,所以比较困难。试着这样做: class ModbusConvert { public static long toUnsign

我必须使用Modbus协议读取设备的值。它有一个6字节长的值,由三个连续的保持寄存器表示。这是有符号和无符号类型的图形表示


我可以使用Java中的Modbus库读取三个寄存器。每个寄存器读取为2字节的短值。现在我需要知道如何组合这三个值以形成有符号和无符号格式的整数值?

请记住,我已经很久没有编写java了,所以我的java非常生疏。因为Java中没有无符号值,所以比较困难。试着这样做:

class ModbusConvert
{
    public static long toUnsigned(int register0, int register1, int register2)
    {
        //NOTE: Assumes long is 64-bit, int is 32-bit

        // Convert each register to a long in the appropriate bit position and OR them together
        long v2 = (((long)register2) & 0x0FFFF);
        long v1 = (((long)register1) & 0x0FFFF) << 16;
        long v0 = (((long)register0) & 0x0FFFF) << 32;
        return v0 | v1 | v2;
    }

    public static long toSigned(int register0, int register1, int register2)
    {
        //NOTE: Assumes long is 64-bit, int is 32-bit

        // Convert each register to a long in the appropriate bit position and OR them together
        if ((register0 & 0x8000) != 0) register0 |= 0xFFFF0000; // Sign extend

        long v2 = (((long)register2) & 0x0FFFF);
        long v1 = (((long)register1) & 0x0FFFF) << 16;
        long v0 = ((long)register0) << 32;
        return v0 | v1 | v2;
    }

    public static void main(String args[])
    {
        // Example Register Values (value = 0xFEDC76543210)
        int register0 = 0xFEDC;
        int register1 = 0x7654;
        int register2 = 0x3210;

        long unsigned = toUnsigned(register0, register1, register2);
        long signed = toSigned(register0, register1, register2);

        System.out.println(String.format("UNSIGNED: 0x%016X", unsigned));
        System.out.println(String.format("SIGNED  : 0x%016X", signed));
    }
}

The output is:
UNSIGNED: 0x0000FEDC76543210
SIGNED  : 0xFFFFFEDC76543210
class modbus转换
{
公共静态长时间登录(int register0、int register1、int register2)
{
//注意:假设long为64位,int为32位
//将每个寄存器转换为适当位位置的long,并将它们一起转换
长v2=((长)寄存器2)和0x0FFFF);

long v1=((long)register1)&0x0FFFF)请记住,我已经很长时间没有编写java了,所以我的java非常生锈。因为java中没有未签名的值,所以这有点困难。请尝试以下方法:

class ModbusConvert
{
    public static long toUnsigned(int register0, int register1, int register2)
    {
        //NOTE: Assumes long is 64-bit, int is 32-bit

        // Convert each register to a long in the appropriate bit position and OR them together
        long v2 = (((long)register2) & 0x0FFFF);
        long v1 = (((long)register1) & 0x0FFFF) << 16;
        long v0 = (((long)register0) & 0x0FFFF) << 32;
        return v0 | v1 | v2;
    }

    public static long toSigned(int register0, int register1, int register2)
    {
        //NOTE: Assumes long is 64-bit, int is 32-bit

        // Convert each register to a long in the appropriate bit position and OR them together
        if ((register0 & 0x8000) != 0) register0 |= 0xFFFF0000; // Sign extend

        long v2 = (((long)register2) & 0x0FFFF);
        long v1 = (((long)register1) & 0x0FFFF) << 16;
        long v0 = ((long)register0) << 32;
        return v0 | v1 | v2;
    }

    public static void main(String args[])
    {
        // Example Register Values (value = 0xFEDC76543210)
        int register0 = 0xFEDC;
        int register1 = 0x7654;
        int register2 = 0x3210;

        long unsigned = toUnsigned(register0, register1, register2);
        long signed = toSigned(register0, register1, register2);

        System.out.println(String.format("UNSIGNED: 0x%016X", unsigned));
        System.out.println(String.format("SIGNED  : 0x%016X", signed));
    }
}

The output is:
UNSIGNED: 0x0000FEDC76543210
SIGNED  : 0xFFFFFEDC76543210
class modbus转换
{
公共静态长时间登录(int register0、int register1、int register2)
{
//注意:假设long为64位,int为32位
//将每个寄存器转换为适当位位置的long,并将它们一起转换
长v2=((长)寄存器2)和0x0FFFF);
长v1=((长)寄存器1)和0x0FFFF)