将字节数组转换为类

Convert a byte array to a class?

本文关键字:转换 数组 字节 字节数      更新时间:2023-10-16

在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;

Java的等价物是什么?

Java等价物是什么?

没有等效的Java。

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

(有几种方法可以做这种事情,但它们是不安全的,不可移植的,而且"不是Java"……在这种情况下它们是不必要的。)

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

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

您可能可以在C中做到这一点。但您可能会陷入混叠问题和燃烧未定义行为的问题。

因为结构填充由编译器决定,所以使用memcpy可能得到的只是ds.member1=0xFF,ds.member2=当时堆栈上出现的任何垃圾,因为member1被填充为占用4个字节,而不是仅占用1个字节。或者,你可能会同时得到垃圾,因为你设置了4字节中的前2个字节,而它们在底部的2个字节中。

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

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