Java / Ada Big Endian到Linux Little Endian问题

时间:2009-06-16 19:16:05

标签: java linux unix endianness ada

我是一名实习生,他在我工作的地方继承了测试程序的问题。经过一段时间的搜索,我可以遇到完全相同的问题。在这里问了一下之后,我发现发布这个的人确实在这里工作了,我也得到他的帮助,但我认为他比我更简洁地解释了这个问题。

on this forum

对于那些不想阅读所有垃圾的人来说,这是它的主旨。我们有一个在客户端运行的GUI,可以远程调用在Ada中编写的在SPARC Unix机器上运行的测试应用程序。当建筑物中的每个人都使用Unix机器完成所有工作时,测试应用程序和gui工作得很好,但最近每个人都有更新的更快的linux x86机器。

升级的任何人都无法运行测试应用,因为测试应用和GUI之间的Big / Little Endian不兼容。

现在,我的工作是弄清楚如何解决它。现在,我知道这里会有一个重要的应用程序重写,我可能不得不重新定义GUI和测试应用程序如何相互通信,但是如何在不完全拆解程序的情况下执行此操作? / p>

我自己提出的一些选项如下: Java RMI XML / RPC 肥皂 数据烘焙?

请记住,我是网络编程的全部菜鸟,尽管这些“解决方案”看起来对我有用,但我可能完全偏离基础。请帮忙!

2 个答案:

答案 0 :(得分:1)

您无需重写任何内容。只要确保你在双方使用网络订单(大端,你自然地表达数字的方式)。 x86使用little endian,所以你必须查看在x86上失败的任何应用程序的源代码。

然后,调用htonl / htons / ntohl / ntohs(请参阅man 3 htonl)或类似函数,将发送/接收的每个数字转换为发送/接收数据的代码部分中的正确编码。 Java总是使用网络顺序,因此您不必担心本机Java代码。

答案 1 :(得分:0)

你正在寻找一个非常重的解决方案。 (仅供参考:另一个类似的重要解决方案是ASN.1)。

您真正需要做的就是在一侧(可能是测试应用程序)添加代码,以便对输入数据执行字节交换。

当然,棘手的部分是你不能(通常)只交换字节。您必须知道数据是什么,因为两个2字节整数需要以不同于同一地址的单个4字节整数进行交换。字符数据根本不会被交换。

可能的简易解决方案: 如果您使用Gnat作为您的Ada编译器,一种选择是重写数据传输代码以使用流(如果不是这样做的话),在Linux上编写一些Ada代码结束使用流读取它。然后修复编译器以使用XDR版本的Ada流(更详细地解释herehere。Ghost流的XDR版本自动处理字节交换。