当前位置: 首页 > 知识库问答 >
问题:

将字节数组转换为 Java 类型

许学真
2023-03-14

我有一个非常具体的要求。我有一个java应用程序,在这里我必须将字节数组转换为具有int、String等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)。

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

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

共有2个答案

胡高朗
2023-03-14

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

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

祝灼光
2023-03-14

我不确定你是否能把它直接转换成java结构,但是我想这不太可能。此外,如果它工作,你不能确定数据类型的大小是相同的。如果在具有不同架构的不同机器上运行C应用程序和Java应用程序,它们的大小可能不同。

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

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

牛奶脂肪球

 类似资料:
  • 问题内容: 将转换为的快速方法是什么? 例如 问题答案: 看看ByteBuffer类。 设置字节顺序保证了,,和。 或者,你可以手动执行以下操作: 该班是专为尽管这样的脏手任务。实际上,私有定义了以下辅助方法:

  • 问题内容: 我有一个要加密的字节数组,然后转换为字符串,以便可以传输。当我收到字符串时,我必须将字符串转换回字节数组,以便可以对其进行解密。我检查了接收到的字符串是否与发送的字符串(包括长度)匹配,但是当我使用诸如str.getBytes()之类的东西将其转换为字节数组时,它与我的原始字节数组不匹配。 示例输出: 任何想法如何将接收到的字符串转换为与发送的字节数组匹配的字节数组? 谢谢 问题答案:

  • 问题内容: 当我对字节的调用全部为0 后查看缓冲区时,从相机返回的位图是不可变的……但这无关紧要,因为它正在执行复制操作。 此代码可能有什么问题? 问题答案: 尝试这样:

  • 问题内容: 我有一个接收a的函数,但是我所拥有的a是进行此转换的最佳方法是什么? 我想我可以走很长一段路,然后将其放入字符串并放入字节中,但这听起来很难看,而且我认为还有更好的方法可以做到。 问题答案: 我同意Brainstorm的方法:假设您要传递机器友好的二进制表示形式,请使用该库。OP建议可能会有一些开销。纵观源的实施,我看到它做了一些运行时的决策最大的灵活性。 对?Write()接受一个非

  • 问题内容: 我需要将缓冲区的长度存储在4个字节大的字节数组中。 伪代码: 做到这一点的最佳方法是什么?请记住,稍后我必须将该字节数组转换回整数。 问题答案: 您可以使用以下方式将其转换为字节: 注意,这样做时可能必须考虑字节顺序。

  • 问题内容: 我想在UDP协议中使用字节格式发送数据时遇到问题,问题是当我尝试使用json对象类型创建数据时,无法获取数据的字节格式,这是我的示例代码: 我知道我的问题,但我找不到如何将json对象转换为字节,有什么建议吗? 问题答案: 获取字符串的字节: