2011-08-25 4 views
0

누군가이 코드를 어떻게 처리하는지 이해할 수 있습니까? 비트 배열에서 정수를 만드는 것처럼 보입니다. 어떻게 그 일을하는지 확실하지 않습니다. 0xFF에서 비트가 & 인 이유는 무엇입니까? 동일한 결과를 산출 할 예정입니까? 다만 32 비트 길이로 4 개의 8 비트 바이트를 변환하는 매우 장황한 방법C 비트 연산 질문

//first take the first 4 bytes read out of the socket into an array and 
//make them a 32 bit integer 

     long ltemp =0; 
     long ltemp2 = 0; 
     ltemp = ltemp | (unsigned char)(analog_val_ptr[0] & 0xff); 
     ltemp = ltemp << 24; 
     ltemp2 = ltemp2 | (unsigned char)(analog_val_ptr[1] & 0xff); 
     ltemp2 = ltemp2 << 16; 
     ltemp = ltemp2 | ltemp; 
     ltemp2 =0; 
     ltemp2 = ltemp2 | (unsigned char)(analog_val_ptr[2] & 0xff); 
     ltemp2 = ltemp2 << 8; 
     ltemp = ltemp2 | ltemp; 
     ltemp = ltemp | (unsigned char)(analog_val_ptr[3] & 0xff); 

///then convert that integer into a float, passing 
+0

analog_val_ptr의 유형은 무엇입니까? 프로그래머가'& 0xFF'를 사용하고'unsigned char'를 사용하여 이중으로 확신하려고하는 것처럼 보입니다. 어느 쪽이든 내가 생각하기에 스스로 할 것입니다. – john

+0

그것의 바이트, 소켓에서 데이터가 들어오고있다. – user489041

답변

3

.

0xffand은 각 값의 하위 8 비트 (0xff == binary 11111111) 만 사용한다는 것을 보장합니다.

비트 이동 (8의 배수)은 각 문자를 올바른 위치로 가져 오는 것입니다. 다른 방법

unsigned long ltemp = (unsigned char)(analog_val_ptr[0] & 0xff); 
ltemp = (ltemp << 8) | (unsigned char)(analog_val_ptr[1] & 0xff); 
ltemp = (ltemp << 8) | (unsigned char)(analog_val_ptr[2] & 0xff); 
ltemp = (ltemp << 8) | (unsigned char)(analog_val_ptr[3] & 0xff); 

또는, (그들이 사용할 수있어 가정), 작업을 위해 특별히 htonl()ntohl()을 올바른 도구를 사용

모든 것은

는 같은으로 대체 할 수있다.

+0

'& 0xff'와'unsigned char' 로의 캐스트는 완전히 중복되어있다. 하나 또는 다른 하나는 제거해야하며 아마도 캐스팅해야합니다. –

+0

스타일의 문제로 결과에 대해 명확한 결과를 얻으려면 결과를 '부호없는 long'으로 만드는 것이 좋습니다. –

+0

@Kerrek, 좋은 지적, 수정하도록 수정 됨. – paxdiablo

1

배열의 정수가 바이트 인 인 것처럼 보입니다. analog_val_ptr[]int 또는 short 값의 배열 일 수 있으며이 코드는 각 항목을 바이트로 처리하도록 설계되었습니다. 마스킹은 부호 비트가 대상 변수에 범람하지 않도록 방지하는 것입니다.

0
var = 0x ? ? ? ? ? ? ? ? 
     & & & & & & & & 
     0x 0 0 0 0 0 0 f f 
     ------------------ 
     0 0 0 0 0 0 ? ? 

AND 연산 후 하위 8 비트는 var & 0xff으로 발견됩니다. 그 부분 만 마스킹하여 필요한 부분을 잘라냅니다.

위의 코드는 4 개의 배열 요소의 하위 바이트를 long int로 변수 ltemp에 붙여 넣습니다.

+0

'&'는 AND이고, XOR이 아닙니다. – Hasturkun

+0

나는 화를 냈습니다. 죄송합니다. 수정되었습니다 .. – phoxis

1

은 엔디안 독립 변환에 사용되는 것처럼 보입니다.