在 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
或设置方法,具体取决于您要实现的目标。
(有几种方法可以做这种事情,但它们是不安全的、不可移植的并且“不是 Java”......在这种情况下它们是没有保证的。)
您编写的memcpy
取决于结构的内部实现,不一定有效。在java中,您需要定义一个接受字节数组并设置字段的构造函数。没有这样的快捷方式,因为类的内存结构没有定义。
在 Java中,您不能直接使用内存(否memcpy
),这是 Java 的优点(缺点?)。有一些 java 库方法可以复制数组:System.arraycopy()。一般来说,要复制一些对象,您需要使用clone方法来发送它。
你也许可以在 C 中做到这一点。但你会陷入混叠问题和一个 hunka hunka 燃烧未定义行为的问题。
而且因为 struct padding 取决于编译器,所以 memcpy 可能得到的只是 ds.member1 = 0xFF, ds.member2 = 当时堆栈上发生的任何垃圾,因为 member1 被填充为占用 4 个字节而不是而不仅仅是 1。或者你可能会同时得到垃圾,因为你设置了 4 字节的前 2 个字节,而它们位于底部的 2 个字节中。
您正在徘徊的是编译器/运行时特定的内存布局。在 Java 中也是如此。Java 本身不会让你做如此可怕的非 Java 的事情,但是如果你编写自己的 JVM 或调试用 C 或 C++ 编写的现有 JVM,你可以做类似的事情。谁知道会发生什么;我不是 Java 神,无法确切知道 JVM 规范对 JVM 实现的限制程度,但我的猜测是,还没有达到启用对象的内存中、运行时表示的互操作性所必需的程度。
因此,您会在每种语言风格中获得未定义的行为。每种语言的味道都一样好——就像神秘的肉。