2009-06-16 9 views
2

Je suis un stagiaire qui a hérité d'un problème avec un programme de test à l'endroit où je travaille. Après avoir cherché un peu sur un peu je peux traverser une personne avec mon même problème. Après avoir demandé un peu ici, j'ai découvert que le gars qui a posté cela fonctionne toujours ici, et je reçois son aide avec cela aussi, mais je pense qu'il explique le problème un peu plus sussinctement que moi.Java/Ada Big Endian à Linux Little Endian problèmes

on this forum

Voici le jist de celui-ci pour ceux d'entre vous qui ne veulent pas lire toutes ces ordures. Nous avons une interface graphique qui s'exécute du côté client et effectue des appels à distance à une application de test écrite dans Ada qui s'exécute sur une machine SPARC Unix. Quand tout le monde dans le bâtiment a utilisé des machines Unix pour tout faire, l'application de test et le gui ont bien fonctionné, mais récemment tout le monde a eu des machines linux x86 plus récentes. Tous ceux qui ont obtenu la mise à niveau ne sont pas en mesure d'exécuter l'application de test en raison de l'incompatibilité Big/Little Endian entre l'application de test et l'interface graphique.

Maintenant, c'est mon travail de trouver une solution. Maintenant, je sais qu'il va y avoir une grosse réécriture d'application ici, et je vais probablement devoir redéfinir la façon dont l'interface graphique et l'application de test se parlent, mais comment puis-je faire cela sans désassembler complètement le programme?

Quelques-unes des options que je suis venu avec moi-même sont les suivantes: Java RMI XML/RPC SOAP données de cuisson? Gardez à l'esprit, je suis un total de programmation réseau et même si ces "solutions" peuvent me sembler valables, je peux être complètement hors de la base. S'il vous plaît aider!

+0

Comment avez-vous vérifié que l'endianness était, en fait, le problème? – Eddie

+0

@Eddie - Je ne l'ai pas encore vérifié moi-même. Je vais sur la parole du dernier gars qui a travaillé sur le programme. Je suppose qu'ils continuent à amener les gens à travailler dessus, mais en les attirant vers d'autres projets. –

+0

@Eddie: Si ce n'est pas * le * problème, c'est un * problème *. Ces deux systèmes avaient une endianness différente. L'ordre des octets * sera * erroné si vous transmettez des données entre eux et ne les prenez pas en compte. –

Répondre

1

Vous n'avez pas besoin de réécrire quoi que ce soit. Assurez-vous simplement d'utiliser l'ordre réseau (big endian, la façon dont vous exprimez naturellement les nombres) des deux côtés. x86 utilise peu endian, donc vous devez regarder le code source de toute application qui échoue sur x86. Ensuite, appelez htonl/htons/ntohl/ntohs (voir man 3 htonl) ou une fonction similaire pour convertir chaque nombre que vous envoyez/recevez au codage correct dans les portions de code qui envoient/reçoivent des données. Java utilise toujours l'ordre réseau, vous n'avez donc pas à vous soucier du code Java natif.

+0

Merci pour la réponse! Malheureusement, je suis maintenant plus confus maintenant. Java s'exécute sur la machine LE et le code Ada s'exécute sur la machine BE, donc tout devrait fonctionner. Retour à la planche à dessin je suppose. –

+2

@Andy Le code Java utilise-t-il JNI? Êtes-vous sûr que l'endianess est le problème? Si oui, vous devriez être capable de nous dire quelle endianess est utilisée sur le fil. Mon conseil: Utilisez wireshark et les débogueurs des deux côtés et demandez à quelqu'un qui est familier avec les composants réseau de l'interface graphique et du serveur. – phihag

+0

@phihag Je suis assez sûr que JNI n'est pas utilisé, et je ne suis pas sûr à 100% que l'endianess est le problème. J'ai appris de ce problème du dernier type à travailler dessus. Merci pour les suggestions. Je vais certainement essayer de mettre cela en place et voir ce que je peux comprendre. –

0

Vous cherchez une solution vraiment lourde. (FYI: Une autre solution similaire lourde est ASN.1).

Tout ce que vous avez vraiment besoin de faire est d'ajouter du code d'un côté (probablement l'application de test) pour effectuer un échange d'octets sur les données entrantes. La partie délicate est bien sûr que vous ne pouvez pas (généralement) simplement échanger des octets. Vous devez savoir quelles sont les données, car deux entiers de 2 octets doivent être échangés différemment d'un seul entier de 4 octets à la même adresse. Les données de personnage ne sont pas échangées du tout.

Solution facile possible: Si vous utilisez Gnat que votre compilateur Ada, une option serait de réécrire le code de transmission de données à utiliser les flux (si elle ne se fait pas de cette façon déjà), et écriture du code Ada à la fin de Linux pour le lire en utilisant des flux. Ensuite, fixez vos compilateurs pour utiliser la version XDR des flux Ada (expliquée plus en détail here et here.) La version XDR des flux de Gnat gère automatiquement le byte-swapping.

Questions connexes