用于Java的C ++中的结构和指针的语法

时间:2014-07-29 22:24:43

标签: java c++ porting typecasting-operator

这里我有一部分代码。有两个简单的结构,稍后在.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没有指针,没有结构没有无符号整数,我没有得到上述代码的语法。这是我得到的,但是抛出了语法错误:

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);
    }
}

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

3 个答案:

答案 0 :(得分:2)

您无法将对象HelloPac(其类型为字节数组)强制转换为nd类型。

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

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

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

答案 1 :(得分:0)

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

要做到这一点: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赋值做类似的逻辑。

答案 2 :(得分:0)

对特定对象的引用在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类型的数组中。

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.nextHallo = hello2;

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

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

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

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字节的短路,因此我们需要组合2个字节的HelloPac [2]&amp; HelloPac [3]获取短值并分配给nd.l。

可以通过以下方式完成此操作:2 bytes to short javaConvert from 2 or 4 bytes to signed/unsigned short/int

注意:通常我们会使用像ArrayList和LinkedList这样的内置集合来表示java中的相同内容。我提供的代码片段不符合首选的java编码标准。