2010-07-26 4 views
16

테스트 목적으로 빅 엔디안 동작을 에뮬레이트 할 수 있는지 궁금합니다.C에서 빅 엔디안 동작을 모방하거나 에뮬레이트 하시겠습니까?

windows 또는 linux, mingw 또는 gcc를 통해. 여기에 내가 에뮬레이션 큰 엔디안을 반환하고자하는 코드의 예는 다음과 같습니다

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#include <limits.h> 
#if CHAR_BIT != 8 
#error "Unsupported char size for detecting endianness" 
#endif 

int main (void) 
{ 
    short int word = 0x0001; 
    char *byte = (char *) &word; 
    if (byte[0]) printf("little endian"); 
    else printf("big endian"); 
    return 0; 
} 
+0

[빅 엔디안 아키텍처를 사용하는 컴퓨터에서 코드를 테스트하는 방법?] (http://stackoverflow.com/q/2839087/995714) –

답변

19

바이트 순서 htons 사람 엔디안 사람 : GCC이 유닉스, BSD 및 Linux 시도에 -D_BSD_SOURCE

이 필요합니다. 빅 엔디안 아키텍처 용 에뮬레이터를 설치하고 에뮬레이터 용 프로그램을 컴파일하면됩니다.

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

는 QEMU의 모든 종류의 데비안 디스크 이미지 아키텍처를 지원되지 : 여기에서, 하나의 방법입니다. mips, sparc 및 arm은 big-endian입니다 (-el로 끝나는 것을 다운로드하지 마십시오). Debian Lenny를 MIPS (http://people.debian.org/~aurel32/qemu/mips/)로 사용하고 있습니다. 플랫폼에 QEMU를 설치 한 다음 MIPS 페이지의 지침에 따라 이미지 및 커널 파일을 다운로드하십시오.

이제 콘솔에서 MIPS 용 Debian 5로 부팅 할 수 있습니다.당신에게 가상 머신 로그인, 될 슈퍼 유저가와 (암호는 "루트"임) 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 
+0

답장을 보내 주셔서 감사합니다. 아직 실제로 설정하지는 않았지만 내 필요에 응답해야한다고 생각합니다. –

+0

일부 아키텍처는 스위칭을 지원합니다. ppc는'-mlittle-endian '으로 컴파일 할 수 있지만, 프로그램 자체가 스스로 할 수 없으므로 쓸모가 없다. – u0b34a0f6ae

0

왜 런타임에서 플랫폼의 엔디안을 감지할까요? 컴파일 할 때 엔디안 모드가 알려져 있습니다. 귀하의 코드는 기대하는 바를 수행합니다 ... 짧은 int가 대상 플랫폼에서 2 바이트라고 가정합니다. 이 중단을 방지하려면 마지막 바이트를 보는 것이 좋습니다. (byte [sizeof (short int) - 1])

+0

좀 더 자세한 요구 사항은 다음과 같습니다. 파일. 데이터는 로컬 환경의 고유 엔디안을 따릅니다. 이제이 데이터가 다른 환경에서 유효하기를 원합니다. 즉, 원래 환경의 지표를 통해 '조정'해야한다는 의미입니다. 이해가 되길 바랍니다. –

+0

모범 사례는 이와 같은 경우 작성자의 아키텍처에 관계없이 파일 형식에 단일 endianness를 사용합니다. htons, htonl, ntohl, ntohs와 같이 도움이되는 유용한 메소드가 있습니다. ([host | network]에서 [host | network] [short | long]로) htons는 기본 로컬 endianness에 관계없이 짧은 시간이 걸리고 big endian으로 변환됩니다. ntohl은 빅 엔디안을 길게 가져 와서 로컬 바이트 순서로 변환합니다. 이러한 방법을 사랑하십시오. 그들은 당신의 친구입니다. – Sniggerfardimungus

+0

헤더에 엔디안을 포함하는 파일 형식이 몇 개 있으며 엔디안 형식으로 변환하거나 적어도 엔디안 형식으로 변환 할 수있는 라이브러리가 있습니다. 그것은 할 일이다. – nategoose

2

정말 이것을 원한다면 Intel Mac을 사용하고 x86 및 ppc 용으로 빌드 할 수 있습니다. ppc 실행 파일은 Rosetta 에뮬레이션을 통해 실행되며 빅 엔디안이지만 네이티브 x86 빌드는 물론 리틀 엔디안입니다.

+0

Intel Mac은 하드웨어입니까? –

+0

@Doori : 예, Intel CPU가 장착 된 Mac입니다 (IBM/Motorola PowerPC CPU를 보유한 구형 Mac과 반대) –

+0

소프트웨어 기반 솔루션에 대해 알고 계시나요? –

4

다른 모든 용도 사이에 hton * (호스트 TO 네트워크) 및 ntoh * (네트워크 TO 호스트) 통화를 보낼 수 있습니다. 네트워크 엔디안은 빅 엔디 언입니다.

16 비트 : htons = 호스트가 짧은 호스트에 짧은 ntohs = 네트워크를 네트워크에

32 비트 : htonl = 호스트에

정말 모두 호스트 긴 호스트하는 긴 ntohl = 네트워크를 네트워크에 네트워크와 호스트 간 네트워크는 동일한 스와핑이 어느 쪽이든 발생하기 때문에 동일합니다.

이들은 일반적으로 매크로로 구현되며 빅 엔디안을 사용하는 플랫폼에서는 아무 작업도 수행하지 않습니다. 일반적으로 볼 수 있습니다

#include <arpa/inet.h> 

:

그들은에 살고 있습니다.

라이브러리에있는 경우 <endian.h>을 사용할 수도 있습니다. 사람 당신은 테스트 목적으로 또는 그런 아무것도 endianes을 전환 할 수 없습니다

+0

나는 "깨끗한"솔루션을 원했지만 ... 나는 에뮬레이션을 적극적으로하지 않는 역할을하고있다. (보다 엄격한 검증 목적을 위해) –

+0

'int output_32 (FILE * f, uint32_t x) {if (io_endian! = local_endian) {x = endian_swap32 (x); } 반환 fwrite (& x, sizeof (uint32_t), 1, f); }' – nategoose

5

을 바이트 순서 관련 문제에 대한 프로그램을 테스트하기 위해 내 리틀 엔디안 Intel 시스템에서 -endian 에뮬레이션을 사용합니다. QEMU PowerPC 에뮬레이터는 좋은 해결책처럼 보였다. 아래에 설명 된 단계를 문서화했습니다.

1) 설치된 QEMU.

nifty:~# aptitude update && aptitude install qemu 

2) 다운로드 한 http://sourceforge.net/projects/mac-on-linux/files/에서 온 리눅스 맥 및 '는/usr/share/QEMU'에 다운로드의 'video.x'파일을 복사. 이것은 qemu-system-ppc가 그것에 대해 불평하는 것을 막기 위해 필요했습니다.

nifty:~# tar -xjf mol-0.9.72.1.tar.bz2 
nifty:~# cp mol-0.9.72.1/mollib/drivers/video.x /usr/share/qemu 

3) PowerPC 용 데비안을 다운로드하여 QEMU 하드 디스크 이미지에 설치했습니다.

[email protected]:~/qemu$ wget --no-verbose http://cdimage.debian.org/debian-cd/5.0.4/powerpc/iso-cd/debian-504-powerpc-CD-1.iso 
2010-06-19 02:55:06 URL:http://caesar.acc.umu.se/debian-cd/5.0.4/powerpc/iso-cd/debian-504-powerpc-CD-1.iso[675569664/675569664] -> "debian-504-powerpc-CD-1.iso" [1] 
[email protected]:~/qemu$ qemu-img create powerpc.img 2G 
Formatting 'powerpc.img', fmt=raw size=2147483648 
[email protected]:~/qemu$ qemu-system-ppc -hda powerpc.img -cdrom debian-504-powerpc-CD-1.iso -boot d -m 512 

4) QEMU PowerPC 에뮬레이터를 하드 디스크 이미지로 부팅했습니다.

[email protected]:~/qemu$ qemu-system-ppc -hda powerpc.img -m 512 

5) 간단한 C 프로그램을 작성하여 실제로 빅 엔디안 시스템에 있음을 확인했습니다.

[email protected]:~$ cat endian.c 
#include <stdio.h> 

int main() 
{ 
    int n = 0x1; 
    printf(*((char *) &n) ? "little-endian\n" : "big-endian\n"); 
    return 0; 
} 
[email protected]:~$ gcc endian.c && ./a.out 
big-endian 
[email protected]:~$ 

당신이 말장난을 놓친 경우, 릴리 푸티 아는 원래 빅 엔디안이었습니다.

관련 문제