将字节数组转换为java类型

时间:2016-09-21 10:30:46

标签: java c++ protocol-buffers

我有一个非常具体的要求。 我有一个java应用程序,我必须将字节数组转换为具有java类型的字符串的消息。消息的结构在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 ++应用程序是使用proto缓冲区还是以任何其他方式转换为字节数组。 但是,如果我逐字节解析数组,我可以得到值。 例如 -

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)。

我的问题是 - 如果我为这个结构编写proto,我是否可以将此消息解析为java?

有没有其他方法可以将字节数组转换为java类型?(不使用像google protobuf这样的库)

2 个答案:

答案 0 :(得分:1)

我不确定你是否可以将它直接转换为java结构,但我想这并不容易。此外,如果它工作,您无法确定数据类型的大小是否相同。如果在具有不同体系结构的其他计算机上运行C ++应用程序和Java应用程序,则它可以是不同的大小。

所以在我看来,最好的选择是先将它写入json或xml文件,然后从另一个应用程序中读回来。

如果你想像你已经写过的那样做,那么也许你应该按类型对c ++结构进行排序。所以你可以更好地使用循环。比如,我有5倍4字节的整数和5倍字符串X字节。

mfg

答案 1 :(得分:0)

您可以使用开源javolution库专门查看Struct类,它为直接将C结构映射到Java类型提供了一些支持。

您将遇到映射std :: string类型的问题,因为事先不知道字符串的长度。您将需要以字节流的形式读取它,直到找到表示字符串结尾的空终止符。