Java / Ada Big Endian для Linux Проблемы Little Endian - PullRequest
2 голосов
/ 16 июня 2009

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

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

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

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

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

Вот несколько вариантов, которые я сам предложил: Java RMI XML / RPC МЫЛО Выпечка данных?

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

Ответы [ 2 ]

1 голос
/ 16 июня 2009

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

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

0 голосов
/ 18 июня 2009

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

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

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

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

...