将字节数组转换为 java 类型

Convert the byte array to java types

我有一个非常具体的要求。 我有一个 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

此行将return 更正 id 值(结构中第一个 属性 是 int)。

我的问题是 - 如果我为这个结构写原型,我能把这个消息解析成 java 吗?

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

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

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

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

制造商

您可以使用开源 javolution library specifically take a look at the Struct class,它提供了一些支持,可以将 C 结构直接映射到 Java 类型。

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