我有一个 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/