c++中结构和指针的语法,相当于Java

Syntax for Structure and Pointers in C++ equivalent for Java

本文关键字:语法 相当于 Java 指针 结构 c++      更新时间:2023-10-16

这里有我的一部分代码。有2个简单的结构,稍后在。cpp Send()方法中使用。

    //In the header file I have
        #define P32 (unsigned int)
        #define P16 (unsigned short)
        #define P8 (unsigned char)
        struct nd {
            P8 p;
            P8 c;
            P16 l;
        };
        struct HELLO {
            P32 a1;
            P32 a2;
            P8  a3;
        };

    //In the .cpp I have
        void Send()
        {
            DWORD dw = nd_s + sizeof( HELLO);
            BYTE *HelloPac=new BYTE[dw];
            nd *HelloHr=(nd*)HelloPac; 
            HELLO* _Hello=(HELLO*)(HelloPac+nd_s);
            HelloHr->c=0x10;
            HelloHr->p=0x09;
            Hellohr->l=36;
            _HELLO->a1=6001;
            _HELLO->a2=0
            _HELLO->a3=120;
           //my own read write function
           streamReadWrite->Write(HelloPac, dw);
        }

我正在用Java编写相同的代码(移植代码)。我很困惑,因为我没有在Java中做过很多编码,因为Java没有指针,没有结构,没有无符号整数,我不知道上面代码的语法是如何的。下面是我得到的,但是t抛出语法错误:

public class abc {
    private static final int nd_s = 4; //hard-coded
    public class nd
    {
        public byte p;
        public byte c;
        public short l;
    }
    public class HELLO
    {        
        public int a1;
        public int a2;
        public byte a3;
    }
    private void Send()
    {    
        int dw = nd_s + 30;
        byte[] HelloPac = new byte[dw];
        nd HelloHr = (nd)HelloPac;
        HELLO _Hello = (HELLO)(HelloPac + nd_s);
    }
}

我在类型转换中哪里出错了?

不能将对象HelloPac(其类型为字节数组)强制转换为类型nd

如果你想创建一个由HelloPac的值初始化的nd实例,使用构造函数:

public class nd 
{
...
    public nd (byte[] input)
    {
        // initialize the members here
    }
...
}
...
nd HelloHr = new nd (HelloPac);

顺便说一句,如果你要用Java编码,请使用Java的命名约定:类名用大写,变量名用驼角大写。

对特定对象的引用在Java中充当指向该对象的指针,但与C/c++不同,它不支持指针运算。

HELLO hello1 = new HELLO();
//Put values
hello1.a1 = 5 
//You should not use public variables, make them private and use getter/setter
....
HELLO hello2 = new HELLO();
//Put values
hello2.a1 = 15 
....

这里hello1和hello2是对我们创建的HELLO类型对象的引用。

如果要按顺序存储对所有HELLO对象的引用,可以将它们存储在HELLO类型的Array中。

HELLO[] helloArray = new HELLO[10];
helloArray [0] = hello1;
helloArray [1] = hello2;

可以通过遍历数组来浏览对象。

或者你可以使用链表

public class HELLO
{        
    HELLO nextHallo; // Store reference to next hello object.
    public int a1;
    public int a2;
    public byte a3;
}
HELLO hello1 = new HELLO();
hello1.a1 = 5 (Ideally you should not have public variables)
....
HELLO hello2 = new HELLO();
hello2.a1 = 15 
..........

hello1。

浏览链表中的所有hello对象-

HELLO helloReference = hello1; //Reference to first object
while(helloReference!=null)
{
  helloReference = helloReference.nextHallo ;
  performSomeOperation(helloReference)
}

更新OP关于如何创建nd实例的问题,该实例由HelloPac的值初始化:

byte[] HelloPac = new byte[dw];
nd instance = new nd();
//HelloPac[0] is first byte
nd.p=HelloPac[0]; // Ideally should be done inside constructor of nd
nd.c = HelloPac[1]; //2nd byte

nd。l是一个长度为2字节的short,所以我们需要将两个字节组合起来HelloPac[2] &HelloPac[3]获取短值并赋值给nd.l.

这可以通过以下方式完成- 2字节转换为短java或从2或4字节转换为有符号/无符号短/int

注意:通常我们会使用内置的集合,如ArrayList和LinkedList来表示相同的java。这里提供的代码片段不遵循首选的java编码标准。

在类中使用构造函数将类中的对象初始化为您想要设置的值。

要做到这一点:nd HelloHr = (nd)HelloPac;

在类Nd中添加这个构造函数

public class Nd
    {
        public byte p;
        public byte c;
        public short l;
        List<Byte> byteList;
        public Nd( Byte[] byteArray)
        {
            byteList = new List<Byte>;
             for(Byte byte : byteArray)
               byteList.add(byte)
        }
    }

或者构造函数中类似的逻辑

对Hello赋值执行类似的逻辑