2012-10-26 2 views
0

리틀 엔디안 z80-esque 프로세서에서 32 비트 long int msk = 0xFFFFFF00 (서브넷 마스크)이 있습니다. 오늘 아침에 (unsigned char *)&mskvoid bar(unsigned char * c); 함수에 전달하여이 &msk 값을 통과하여 데이터베이스에 저장하려고하면 endian-ness에 대해 알게되었습니다.int32와 char [4]를 결합 할 때 little-endian-ness를 극복했습니다.

불행히도 z80 프로세서의 리틀 엔디안으로 인해 데이터베이스는 "역방향"값을 저장하고 다른 함수가 바이트를 다시 읽으면 올바른 서브넷 마스크가 아닌 0x00FFFFFF을 봅니다.

노조와 함께이 주변에 사소한 방법이 있습니까? char[3]을 현재 내 long int msk의 LSB에 매핑하고 싶습니다 (char[0]은 LSB를 얻습니다).

결국 Big-Endian이 좋습니다.

+1

32 비트 정수의 엔디안을 교환하고 있습니다. 그런 접근법을 시도해 보셨습니까? – Ari

답변

2

엔디안 문제를 해결하려면 정수를 디스크 나 네트워크에 직렬화 할 때마다이를 알려진 바이트 순서로 변환하십시오. htonl과 htons 함수가 이미 존재하기 때문에 네트워크 주문 (big-endian이라고도 함)이 가장 쉽습니다. 당신이 long int 값을 가지고 LSB 그것의를 원하는 경우 또는 반복적 byte & 0xFF; byte >>= 8 또는 ((byte >> i*8) & 0xFF)

와 상위 바이트와 하위 바이트를 잡아 당겨 수동으로 할 수 있습니다, 비트를 사용하는 것이 훨씬 더 휴대용 노조 나 형형색환보다는 시프트와 마스크 조작이 필요합니다.

+0

감사합니다, 그 funcs에 대해 몰랐어요! – paIncrease

1

ntohl 그 반대의 경우도 마찬가지 리틀 엔디안에 큰 엔디안 변환에 대한 유래에 많은 답변이 있습니다

+2

참고 : 빅 엔디 언 (big-endian) 시스템에서 실행중인 경우 'ntohl'은 절대 아무 것도하지 않습니다. 따라서 일반 바이트 스와핑에는 사용할 수 없습니다. –

+1

더 구체적으로 말하자면, 'htonl'은 long을 big-endian으로 변환하고, 'ntohl'은 항상 long을 시스템이 사용하는 것으로 변환합니다. 이것은 그들을 상호 보완 적으로 만든다. – Xymostech

+1

제 시스템에서 이상하게 작동했습니다. 즉, ntohl (ntohl (data)) = 데이터입니다. – asbumste