将字节数组转换为java类型
Posted
技术标签:
【中文标题】将字节数组转换为java类型【英文标题】:Convert the byte array to java types 【发布时间】:2016-09-21 10:30:46 【问题描述】:我有一个非常具体的要求。 我有一个 java 应用程序,我必须将字节数组转换为具有 java 类型(如 int、String)的消息。消息的结构在 C++ 中定义如下 -
struct SMSMessage
int id;
std::string name;
std::string source;
std::string destination;
std::string timestamp;
int type;
int status;
std::string message;
int mesg_type;
int mesg_sub_type; ;
我在我的 java 应用程序中收到的是字节数组。 我不知道 c++ 应用程序是否使用原始缓冲区或任何其他方式转换为字节数组。 但是,如果我逐字节解析数组,我可以获得值。 比如——
ByteBuffer.wrap(Arrays.copyOfRange(byteArray, 0, 4)).getInt();
//byteArray -- reference to the incoming byte array
// 0, 4-- range of bytes for integer type
此行将返回正确的 id 值(结构中的第一个属性是 int)。
我的问题是—— 如果我为这个结构写了原型,我能把这个消息解析成 java 吗?
还有其他方法可以将字节数组转换为 java 类型吗?(不使用像 google protobuf 这样的库)
【问题讨论】:
我忘了说,解决方案必须适用于 java 5 和 java 8 听起来这个字节数组可能不是协议缓冲区。如果它被编码为协议缓冲区,那么读取前四个字节不会直接给你第一个整数字段,除非偶然发生。 【参考方案1】:我不确定您是否可以将其直接转换为 java 结构,但我想这并不容易。此外,如果它有效,您无法确定数据类型的大小是否相同。如果您在具有不同架构的不同机器上运行 C++ 应用程序和 Java 应用程序,则其大小可能不同。
所以在我看来,最好的选择是先将其写入 json 或 xml 文件,然后从其他应用程序中读取。
如果你想像你已经写的那样做,那么也许你应该按类型对 c++ 结构进行排序。所以你可以更好地使用循环。比如,我有 5 次 4 字节的整数和 5 次 X 字节的字符串。
制造
【讨论】:
好吧,我不能使用 Json 或任何其他格式,因为我无法控制 c++ 应用程序。不能使用 google-protobuf 吗? 使用逐字节方法。谢谢【参考方案2】:您也许可以使用开源的javolution 库,特别是查看Struct 类,它为直接将C 结构映射到Java 类型提供了一些支持。
您会遇到映射 std::string 类型的问题,因为事先不知道字符串的长度。您需要将其作为字节流读入,直到找到表示字符串结尾的空终止符。
【讨论】:
以上是关于将字节数组转换为java类型的主要内容,如果未能解决你的问题,请参考以下文章