将字节数组转换为类
Convert a byte array to a class?
在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的实现,但我的猜测是,没有达到实现对象的内存中运行时表示的互操作性所必需的程度。
因此,在每种语言风格中都会出现未定义的行为。每种语言的味道都一样好,也像神秘的肉。
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何在C++中将数组转换为矢量指针
- 将矢量<T>转换为矢量<数组<T>>
- JSON转换为nlohmann JSON-lib中的结构数组
- 将C++中的数组转换为字符串
- NLOHMANN 的 JSON 库将数组转换为结构向量
- 将 int 数组转换为 std::vector<int*>
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 将链表转换为指针数组时出错
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- 将字节数组转换为带有字节序问题的指针
- 使用 stbi_write_png,如何将 0 和 1 的矩形字节数组转换为单色 png 文件?
- 将浮点数转换为无符号字符数组并打印出来
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 在 c++ 中动态强制转换 ** 数组
- 返回并强制转换数组指针(错误:数组下标的类型..无效)
- 用于递归模板求值的强制转换数组类型
- node.js中使用node-gyp的转换数组
- 如何转换数组中的参数列表