C-как сделать переменную, чтобы быть большой конец. по умолчанию? - PullRequest
0 голосов
/ 04 ноября 2018

Я хочу, чтобы моя программа по умолчанию использовала большой конец (сейчас это мало). Это означает, что каждый раз, когда я объявляю uint_32 / int, значение, которое будет преобразовано в него, будет иметь высокий конечный порядок. Это возможно? (Не вызывая каждый раз ntohl ()).

Я исследовал Google и s.o в течение 3 дней и не получил никакой информации Я буду очень признателен за любую помощь!

редактировать: У меня есть сервер и клиент. Клиент работает с прямым порядком байтов, а сервер - с прямым порядком байтов. Теперь я отправляю на сервер значение md5 для байтового массива, ntohl () его на сервере и получаю действительное значение md5.

На сервере, когда я вызываю функцию md5.c (кстати, dll), я получаю другое значение. Эта ценность даже не похожа на полученную стоимость. Я предполагаю, что это происходит из-за endiannes. Массив байтов, который я посылаю в функцию, не меняется, потому что это одиночные байты, которые не являются определяющими по порядку байтов, но переменные, которые я объявляю для функции, и с ними я манипулирую своим байтовым arr, могут создать проблему.

Вот почему большой порядок байтов так важен для меня.

Ответы [ 3 ]

0 голосов
/ 04 ноября 2018

Вы можете скомпилировать программу для разных процессоров, некоторые из которых используют байты с прямым порядком байтов вместо байтов с прямым порядком байтов, или вы можете контролировать, как ваш код будет компилироваться в этом аспекте. Например, для MIPS: https://gcc.gnu.org/onlinedocs/gcc/MIPS-Options.html

0 голосов
/ 04 ноября 2018

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

Таким образом, если вы не можете изменить то, как процессор выполняет арифметику с многобайтовыми словами (ARM позволяет вам изменять порядковый номер), вы застряли на том, как работает процессор.

0 голосов
/ 04 ноября 2018

Я хочу, чтобы моя программа по умолчанию использовала большой конец

Вы не можете. endianness является фиксированным свойством целевого процессора (вашего компилятора C) и связано с его архитектурой набора команд .

Вы можете в принципе (но с C, который действительно не стоит проблем) использовать компилятор C для некоторой виртуальной машины (например, WebAssembly или MMIX ) соответствующей порядка байтов или даже определения виртуального байтового кода для машины с нужным порядком байтов.

Вариант этого может быть кросс-компиляция для некоторой другой архитектуры набора команд (например, MIPS, ARM и т. Д.) И использование некоторого эмулятора для запуска исполняемого файла (и необходимой ОС).

Что касается вашего редактирования, вы можете рассмотреть возможность отправки по сети md5sum в буквенно-цифровой форме (например, как вывод команды md5sum).

...