代码之家  ›  专栏  ›  技术社区  ›  flash

使用正确的数据类型转换java中C++方法逻辑

  •  0
  • flash  · 技术社区  · 7 年前

    我在C++中定义了很少的字段,使用这些字段我们正在创造一个新的值。我需要用C++方法来做类似的java语言。

    • “客户机id”定义为uint16
    • “过程id”定义为uint8
    • “pod_计数”定义为uint32_t

    下面是C++方法:

    typedef uint64_t    ClientData;
    
    // convert all four fields into one variable "client_data"
    void pack(uint8_t text, 
              uint16_t client_id, 
              uint8_t proc_id, 
              uint32_t pod_count,
              ClientData& client_data)
    {
        client_data = (uint64_t(text) << 56)
                       + (uint64_t(client_id) << 40)
                       + (uint64_t(proc_id) << 32)
                       + pod_count;
    }
    
    // now retrieve individual fields value from converted "client_data" variable
    void unpack(ClientData client_data,
                uint8_t& text, 
                uint16_t& client_id, 
                uint8_t& proc_id, 
                uint32_t& pod_count)
    {
        pod_count = client_data & 0xffffffff;
        client_data = client_data >> 32;
        proc_id = client_data & 0xff;
        client_data = client_data >> 8;
        client_id = client_data & 0xffff;
        client_data = client_data >> 16;
        text = client_data & 0xff;
    }
    

    public final class ClientData {
      private final byte text;
      private final short clientId;
      private final byte procId;
      private final int podCount;
    
      // this is my pack method corresponding to c++ method above
      public long pack() {
        return (((long) text) << 56) | (((long) clientId) << 40) | (((long) procId) << 32)
            | ((long) podCount);
      }  
    
      // this is my unpack in Java.
      public unpack(long packedValue) {
        this.text = (byte) ((packedValue >>> 56) & ((1 << 8) - 1));
        this.clientId = (short) ((packedValue >>> 40) & ((1 << 16) - 1));
        this.procId = (byte) ((packedValue >>> 32) & ((1 << 8) - 1));
        this.podCount = (int) ((packedValue) & ((1L << 32) - 1));
      }
    }
    

    现在我的问题是,我的逻辑 pack unpack pod_count 在C++中定义为 uint32_t 但在我上面的Java代码中,我将其作为 int

    1 回复  |  直到 7 年前
        1
  •  1
  •   damjad ABHI ROY    7 年前

    默认情况下,Java有带符号的数字,但您可以将它们用作无符号数字。 Java Primitive data types .

    • : byte 是一个8位有符号整数。如果要添加符号位,必须使用short。
    • uint16\u t short 是一个16位有符号整数。如果要添加符号位,必须使用 int .
    • uint32\u t : int 是32位有符号整数。但是,可以将其用作无符号整数。为此,你可能想调查一下 unsigned comparison methods etc.
    • : long

    我认为无论您使用的是有符号还是无符号的数据类型都与按位运算符一起使用。唯一的问题是在打印这些数字或将其转换为字符串时。为此,您可以使用 toUnsignedInteger 方法 Byte Short toUnsignedLong Integer .

    对于逻辑部分: 您可以按C++实现位逻辑,但可以使用类型转换。请参阅 documentation

    public class ClientData
    {
        private int pod_count;
        private byte proc_id;
        private short client_id;
        private byte text;
    
        public static void main (String[] args)
        {
            new ClientData().unpack(Long.decode("0x32112321321fdffa"));
        }
        void unpack(long client_data)
        {
            this.pod_count = (int)(client_data & 0xffffffff);
            client_data = client_data >> 32;
            this.proc_id = (byte) (client_data & 0xff);
            client_data = client_data >> 8;
            this.client_id = (short) (client_data & 0xffff);
            client_data = client_data >> 16;
            this.text = (byte) (client_data & 0xff);
        }
    }