Подражать/эмулировать поведению с обратным порядком байтов в C? [дубликат]

17
задан Doori Bar 26 July 2010 в 18:41
поделиться

4 ответа

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

http://people.debian.org/~aurel32/qemu/

- это образы дисков Debian для всех типов архитектур, поддерживаемых QEMU. mips, sparc и arm имеют прямой порядок байтов (не загружайте ничего, заканчивающееся на -el). Я использую Debian Lenny для MIPS ( http://people.debian.org/~aurel32/qemu/mips/ ). Установите QEMU для своей платформы, затем следуйте инструкциям на странице MIPS, чтобы загрузить образ и файл ядра.

Теперь вы можете загружаться в Debian 5 для MIPS прямо с консоли. Войдите в свою виртуальную машину, станьте суперпользователем (пароль «root») и установите C-компилятор:

debian-mips:~# su -
debian-mips:~# apt-get update
debian-mips:~# apt-get install gcc

запустите редактор и введите свою программу:

debian-mips:~# pico foo.c
debian-mips:~# gcc foo.c
debian-mips:~# ./a.out
big endian
20
ответ дан 30 November 2019 в 12:19
поделиться

Вы можете использовать кучу вызовов hton * (Host TO Network) и ntoh * (Network TO Host) между всеми вашими различными использованиями. Порядок порядка байтов в сети - Big Endian.

16 бит: htons = Узел К сети Короткое ntohs = Сеть К Хосту Короткое

32 бит: htonl = Хост ДО Сети Длинный ntohl = От сети к хосту Long

На самом деле и хост к сети, и сеть к хосту - одно и то же, потому что в любом случае происходит одинаковый обмен местами.

Обычно они реализованы как макросы и не работают на платформах, использующих прямой порядок байтов.

Они живут в:

#include <arpa/inet.h> 

Который общедоступен.

Вы также можете использовать , если он есть в ваших библиотеках. С gcc для этого требуется -D_BSD_SOURCE

В Unix, BSD и Linux попробуйте: человек htons человек с порядком байтов человек byteorder

4
ответ дан 30 November 2019 в 12:19
поделиться

Почему вы хотите определять порядок байтов вашей платформы во время выполнения? Когда вы переходите к компиляции, режим байта известен. Ваш код будет делать то, что вы ожидаете ... при условии, что короткий int равен 2 байтам на целевой платформе. Чтобы избежать этого зависания, лучше взгляните на последний байт. (байт [sizeof (короткое целое) - 1])

0
ответ дан 30 November 2019 в 12:19
поделиться

Если вы действительно хотите сделать это, вы можете использовать Intel Mac и собирать как для x86, так и для ppc. Исполняемый файл для ppc будет работать через эмуляцию Rosetta и будет иметь большой эндин, в то время как родная сборка для x86, конечно же, будет иметь малый эндин.

2
ответ дан 30 November 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: