java - 在 C++ 中访问 Java byte[]

标签 java c++ byte

我有一个 Java 应用程序,它将 byte[] 结构保存到数据库(使用 Hibernate)。我正在编写一个稍后读取这些结构的 C++ 应用程序。

正如您所料,我遇到了问题......写入数据库的 byte[] 结构比原始字节数长 - 27 个字节,从外观来看。

有没有办法确定(在 C++ 中)byte[] header 结构以正确找到真实数据的开头?

我花了一些时间查看 JNI 源代码(GetArrayLength(jbytearray) 等)以确定其工作原理,但很快就陷入了 JVM 代码的变幻莫测之中。恶心...

想法?

最佳答案

该对象可能正在使用 Java Object Serialization Protocol 进行序列化。您可以通过在开头查找魔数(Magic Number) 0xACED 来验证这一点。如果是这种情况,它只是包含一些有关类和长度的元信息,您可以轻松地解析末尾的实际字节值。

特别是,您会看到 0xAC 0xED 0x00 0x05对于 header ,后跟一个 classDesc 元素,即 0x75 ...bytes... 0x70 ,后跟 4 字节长度,然后是字节本身。 Java 以大端格式序列化长度和其他多字节值。

关于java - 在 C++ 中访问 Java byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6299145/

相关文章:

将模块放在一个 Jar 中的 Java 项目

java - 在 JAR 中使用 Tomcat 连接池(来自 Web 应用程序的共享配置,spring 配置)

java - 仅将最后一个对象添加到 ArrayList

c++ - 原生 C++ 项目无法在 Release模式下编译?

ios - 有符号整数,算术左移

java - 如何使用lookback API获取计划估计变更的功能记录

c++ - 正则表达式在开头单独匹配单词,或者通过不重复字符串附加到某些内容但在输入末尾

c++ - 基本的 boost spirit 语义 Action 无法编译

ios - 如何在 iOS Objective C 中将 NSData 转换为 UInt8 数组?

java - 如何有效地将字节数组转换为字符串