Java/Ada大端到Linux小端问题

Java/Ada大端到Linux小端问题,java,linux,unix,endianness,ada,Java,Linux,Unix,Endianness,Ada,我是一名实习生,在我工作的地方继承了一个测试项目的问题。在四处搜索了一下之后,我可以找到一个和我有完全相同问题的人。在这里询问了一下之后,我发现发布这篇文章的人实际上仍然在这里工作,我也得到了他的帮助,但我认为他比我更准确地解释了这个问题 这是给你们这些不想读那些垃圾的人的最新消息。我们有一个GUI,它在客户端运行,并对在SPARC Unix机器上运行的用Ada编写的测试应用程序进行远程调用。当大楼里的每个人都使用Unix机器做任何事情时,测试应用程序和gui工作得很好,但最近每个人都得到了更

我是一名实习生,在我工作的地方继承了一个测试项目的问题。在四处搜索了一下之后,我可以找到一个和我有完全相同问题的人。在这里询问了一下之后,我发现发布这篇文章的人实际上仍然在这里工作,我也得到了他的帮助,但我认为他比我更准确地解释了这个问题

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

任何获得升级的人都无法运行测试应用程序,因为测试应用程序和GUI之间存在Big/Little-Endian不兼容

现在,我的工作就是找出解决方法。现在,我知道这里将有一个大的应用程序重写,我可能必须重新定义GUI和测试应用程序之间的通信方式,但是我如何在不完全分解程序的情况下实现这一点呢

我自己提出的一些选择如下: java远程方法调用 XML/RPC 肥皂 数据烘焙


请记住,我是一个网络编程高手,即使这些“解决方案”对我来说可能是有效的,但我可能完全偏离了底线。请帮忙

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


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

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

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

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

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

谢谢你的回答!不幸的是,我现在更困惑了。Java在LE机器上运行,Ada代码在BE机器上运行,所以一切都应该解决。我想回到绘图板上。@Andy做了最后的解释Java代码使用JNI?你确定endianess是个问题吗?如果是的话,你应该能够告诉我们什么endianess在线路上使用。我的建议是:两边都使用wireshark和调试器,并询问熟悉GUI和服务器网络组件的人。@phihag我很确定JNI没有使用,我也不是100%确定endianess是专业的问题。我是从上一个处理这个问题的人那里了解到这个问题的。谢谢你的建议。我一定会尝试设置它,看看我能想出什么…这意味着必须重写一侧。@T.E.D.如果网络组件是合适的。不需要重写,只需对整数序列化进行一个小的修改。你是如何验证的事实上,endianness是个问题?@Eddie-我自己还没有验证过。我是按照上一个参与这个项目的人的话来做的。我想他们一直在找人做这个项目,但把他们拉到其他项目上去。@Eddie:如果不是问题,那肯定是个问题。这两个系统的endianness不同。B如果您在它们之间传输数据而不将其考虑在内,则顺序将是错误的。