java-将字节数组转换为类?

java-将字节数组转换为类?,java,c++,c,Java,C++,C,在C/C++中,可以执行以下操作: struct DataStructure { char member1; char member2; }; DataStructure ds; char bytes[] = {0xFF, 0xFE}; memcpy(&ds, bytes, sizeof(ds)); ds.member1 = 0xFF; ds.member2 = 0xFE; 你基本上会得到以下结果: struct DataStructure { char member

在C/C++中,可以执行以下操作:

struct DataStructure
{
  char member1;
  char member2;
};

DataStructure ds;
char bytes[] = {0xFF, 0xFE};

memcpy(&ds, bytes, sizeof(ds));
ds.member1 = 0xFF;
ds.member2 = 0xFE;
你基本上会得到以下结果:

struct DataStructure
{
  char member1;
  char member2;
};

DataStructure ds;
char bytes[] = {0xFF, 0xFE};

memcpy(&ds, bytes, sizeof(ds));
ds.member1 = 0xFF;
ds.member2 = 0xFE;

Java等价物是什么?

您编写的
memcpy
取决于结构的内部实现,不一定有效。在java中,需要定义一个接受字节数组并设置字段的构造函数。没有这样的快捷方式,因为类的内存结构没有定义。

您编写的
memcpy
取决于结构的内部实现,不一定有效。在java中,需要定义一个接受字节数组并设置字段的构造函数。没有这样的快捷方式,因为类的内存结构没有定义。

在Java中,您不能直接使用内存(没有
memcpy
),这是Java的优点(缺点?)。有一些java库方法可以复制数组:。
一般来说,要复制某个对象,需要附带方法。

在Java中,不能直接使用内存(不
memcpy
),这是Java的优点(缺点?)。有一些java库方法可以复制数组:。 通常,要复制某个对象,您需要将其与方法一起发送

Java的等价物是什么

没有Java等价物

Java不允许通过在该级别访问对象来创建或修改对象。您应该使用
新的
或setter方法,这取决于您试图实现的目标

(有几种方法可以做到这一点,但它们不安全、不可移植且“不是Java”……在这种情况下,它们是不受保证的。)

Java的等价物是什么

没有Java等价物

Java不允许通过在该级别访问对象来创建或修改对象。您应该使用
新的
或setter方法,这取决于您试图实现的目标


(有几种方法可以做到这一点,但它们不安全、不可移植且“不是Java”……在这种情况下,它们是不可保证的。)

在C中,您可能可以做到这一点。但您会陷入别名问题和hunka hunka燃烧未定义行为

由于结构填充由编译器决定,因此使用memcpy可能得到的结果是ds.member1=0xFF,ds.member2=当时堆栈上出现的任何垃圾,因为member1被填充为占用4个字节,而不仅仅是1个字节。或者两个都有垃圾,因为你设置了4字节中最上面的2个字节,而它们位于最下面的2个字节

您所看到的是特定于编译器/运行时的内存布局。Java也是如此。java本身不会让你做一些可怕的Unjava,但是如果你自己编写JVM或者调试一个用C++或C++编写的现有JVM,你可以做这样的事情。谁知道会发生什么;我不是Java之神,不知道JVM规范在多大程度上限制了JVM实现,但我的猜测是,没有达到实现内存中对象的运行时表示的互操作性所必需的程度


因此,在每种语言风格中都会出现未定义的行为。每种语言的味道都一样好,就像神秘肉一样。

在C语言中,你可能可以做到这一点。但你会陷入别名问题和一种不确定的行为

由于结构填充由编译器决定,因此使用memcpy可能得到的结果是ds.member1=0xFF,ds.member2=当时堆栈上出现的任何垃圾,因为member1被填充为占用4个字节,而不仅仅是1个字节。或者两个都有垃圾,因为你设置了4字节中最上面的2个字节,而它们位于最下面的2个字节

您所看到的是特定于编译器/运行时的内存布局。Java也是如此。java本身不会让你做一些可怕的Unjava,但是如果你自己编写JVM或者调试一个用C++或C++编写的现有JVM,你可以做这样的事情。谁知道会发生什么;我不是Java之神,不知道JVM规范在多大程度上限制了JVM实现,但我的猜测是,没有达到实现内存中对象的运行时表示的互操作性所必需的程度


因此,在每种语言风格中都会出现未定义的行为。在每种语言中,味道也一样好,就像神秘的肉。

你只能在C++中做这种事情,通常是轻视忽略它依赖的所有平台和编译器依赖性。有点小挑剔:java等价物,如果它存在,可能会将字节数组转换成对象,或者对象的一部分,而不是类。(如果字节数组符合Java规范中描述的类定义的结构,实际上可以将Java字节数组转换为类,但这不是您要问的。)@DavidZaslavsky这听起来正是我要问的。我该怎么做?@Brandon不,这和你在问题中输入的C代码完全不一样。但如果你好奇的话,相关的方法是。另一个挑剔:你没有从字节转换成类或对象,你可以从包含在<代码> char 数组中的数据中设置对象的数据成员。你只能在C++中做这种事情,只是粗略地忽略它依赖的所有平台和编译器依赖性。有点小挑剔:java等价物,如果它存在,可能会将字节数组转换成对象,或对象的一部分,而不是类。(如果字节数组符合Java规范中描述的类定义的结构,实际上可以将Java字节数组转换为类,但这不是您要问的。)@DavidZaslavsky这听起来正是我要问的。我该怎么做?@Brandon不,这和你在问题中输入的C代码完全不一样。但如果你好奇的话