2

我是一名实习生,在我工作的地方继承了一个测试程序的问题。在搜索了一下之后,我可以找到一个与我完全相同的问题的人。在这里询问了一下之后,我发现发布此内容的人实际上仍然在这里工作,我也得到了他的帮助,但我认为他比我更深入地解释了这个问题。

在这个论坛上

对于那些不想阅读所有垃圾的人来说,这是它的要点。我们有一个在客户端运行的 GUI,它远程调用在 SPARC Unix 机器上运行的用 Ada 编写的测试应用程序。当大楼里的每个人都使用 Unix 机器做所有事情时,测试应用程序和 gui 工作得很好,但最近每个人都得到了更新更快的 linux x86 机器。

由于测试应用程序和 GUI 之间的 Big / Little Endian 不兼容,任何获得升级的人都无法运行测试应用程序。

现在,我的工作是弄清楚如何解决它。现在,我知道这里将有一种大型应用程序重写,我可能不得不重新定义 GUI 和测试应用程序如何相互通信,但是如果不完全反汇编程序,我怎么能做到这一点呢?

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

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

4

2 回答 2

1

你不需要重写任何东西。只要确保你在两边都使用网络顺序(大端,你自然表达数字的方式)。x86 使用 little endian,因此您必须查看任何在 x86 上失败的应用程序的源代码。

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

于 2009-06-16T19:28:05.293 回答
0

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

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

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

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

于 2009-06-17T20:27:14.633 回答