这里我有一部分代码。有两个简单的结构,稍后在.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);
}
}
在类型转换中我哪里出错?
答案 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 java或Convert from 2 or 4 bytes to signed/unsigned short/int
注意:通常我们会使用像ArrayList和LinkedList这样的内置集合来表示java中的相同内容。我提供的代码片段不符合首选的java编码标准。