Проблемы с Java/Ada Big Endian в Linux Little Endian

Я стажер, который унаследовал проблему с программой тестирования на том месте, где я работаю. Немного поискав, я могу найти человека с точно такой же проблемой. Немного расспросив здесь, я узнал, что парень, опубликовавший это, на самом деле все еще работает здесь, и я тоже получаю от него помощь, но я думаю, что он объясняет проблему немного более доходчиво, чем я.

на этом форуме

Вот краткое изложение для тех из вас, кто не хочет читать весь этот мусор. У нас есть графический интерфейс, который работает на стороне клиента и выполняет удаленные вызовы тестового приложения, написанного на Ada, которое работает на машине SPARC Unix. Когда все в здании использовали компьютеры Unix, тестовое приложение и графический интерфейс работали нормально, но недавно все получили новые, более быстрые машины Linux x86.

Любой, кто получил обновление, не может запустить тестовое приложение из-за несовместимости Big / Little Endian между тестовым приложением и графическим интерфейсом.

Теперь моя задача выяснить, как это исправить. Теперь я знаю, что здесь будет переписано большое приложение, и мне, вероятно, придется переопределить, как графический интерфейс и тестовое приложение взаимодействуют друг с другом, но как я могу сделать это без полного разбора программы?

Несколько вариантов, которые я придумал сам, следующие: Java RMI XML/RPC SOAP Data Baking?

Имейте в виду, что я полный ноль в сетевом программировании, и хотя эти «решения» могут показаться мне правильными, я могу быть совершенно неправ. Пожалуйста помоги!


person Community    schedule 16.06.2009    source источник
comment
Как вы убедились, что на самом деле проблема была в порядке следования байтов?   -  person Eddie    schedule 17.06.2009
comment
@ Эдди - я сам еще не проверял это. Я исхожу из слов последнего парня, работавшего над программой. Думаю, они продолжают заставлять людей работать над этим, но перетягивают их на другие проекты.   -  person    schedule 17.06.2009
comment
@Eddie: Если это не проблема, то это, безусловно, проблема. Эти две системы имели разный порядок следования байтов. Порядок байтов будет неправильным, если вы передаете данные между ними и не принимаете это во внимание.   -  person T.E.D.    schedule 18.06.2009


Ответы (2)


Вам не нужно ничего переписывать. Просто убедитесь, что вы используете сетевой порядок (прямой порядок байтов, как вы обычно выражаете числа) с обеих сторон. x86 использует обратный порядок байтов, поэтому вам нужно посмотреть исходный код любого приложения, которое не работает на x86.

Затем вызовите htonl/htons/ntohl/ntohs (см. man 3 htonl) или аналогичную функцию, чтобы преобразовать каждое число, которое вы отправляете/получаете, в правильную кодировку в частях кода, которые отправляют/получают данные. Java всегда использует сетевой порядок, поэтому вам не нужно беспокоиться о собственном коде Java.

person phihag    schedule 16.06.2009
comment
Спасибо за ответ! К сожалению, сейчас я еще больше запутался. Java работает на машине LE, а код Ada работает на машине BE, так что все должно работать. Вернуться к чертежной доске, я думаю. - person ; 16.06.2009
comment
@Andy Использует ли код Java JNI? Вы уверены, что проблема в порядковом порядке? Если это так, вы должны быть в состоянии сказать нам, какой порядок следования байтов используется в сети. Мой совет: используйте wireshark и отладчики с обеих сторон и спросите кого-нибудь, кто знаком с сетевыми компонентами графического интерфейса и сервера. - person phihag; 17.06.2009
comment
@phihag Я почти уверен, что JNI не используется, и я не на 100% уверен, что проблема в порядке байтов. Я узнал об этой проблеме от последнего парня, работавшего над ней. Спасибо за предложения. Я обязательно попробую настроить это и посмотреть, что я могу понять. - person ; 17.06.2009
comment
... что означает, что одну сторону нужно переписать. - person T.E.D.; 18.06.2009
comment
@ТЕД. Если сетевые компоненты приличные. нет необходимости переписывать, просто небольшая модификация целочисленной сериализации. - person phihag; 18.06.2009
comment
Ну а теперь спорим о семантике. Я думаю, мы оба говорим, что что-то новое должно быть написано в той или иной части, но не в каждой строке кода, да? - person T.E.D.; 18.06.2009

Вы смотрите на действительно тяжелое решение. (К вашему сведению: другое столь же тяжелое решение — ASN.1).

Все, что вам действительно нужно сделать, это добавить код на одной стороне (вероятно, тестовое приложение), чтобы выполнить замену байтов для входящих данных.

Сложность, конечно, в том, что вы не можете (как правило) просто поменять местами байты. Вы должны знать, что такое данные, потому что два 2-байтовых целых числа должны меняться местами иначе, чем одно 4-байтовое целое число по одному и тому же адресу. Данные персонажей вообще не меняются местами.

Возможное простое решение. Если вы используете Gnat в качестве компилятора Ады, одним из вариантов будет переписать код передачи данных для использования потоков (если это еще не сделано таким образом), и напишите код Ada на стороне Linux, чтобы читать его с помощью потоков. Затем настройте свои компиляторы на использование XDR версии потоков Ada (подробнее см. здесь и здесь. XDR-версия потоков Gnat автоматически обрабатывает обмен байтами.

person T.E.D.    schedule 17.06.2009