2017-01-24 2 views
2

페이로드 끝 부분에 uint16을 추가 한 다음 수신기에서 uint16을 다시 가져 와서 c에서 uint16으로 다시 가져 오는 작업을 계속합니다.C : uint16_t를 송신자 페이로드에 추가하고 수신자에게 다시 보냅니다.

uint16은 cmpId입니다. 보낸 사람이 수행합니다

 const UInt8* data = getArray(byteArray); 
     data_length = getLenArray(byteArray) 
     data_length = data_length + 2; 
     UInt8 formatted_data[data_length]; 

     //serialize cmpid 
     formatted_data[data_length-2] = cmpId & 0xff; 
     formatted_data[data_length-1] = cmpId >> 8; 

및 수신기가이 작업을 수행 :

 UInt8 len = (UInt8) ((smip_receive_t *) data)->payloadLen; 
     UInt8 * payload = (UInt8 *) ((smip_receive_t *) data)->payload; 

     UInt16 cmpid; 
     cmpid = (payload[len-2] << 8) | payload[len-1]; 

그러나 cmpId가 제대로을 통해되지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+1

참고 : 고정 된 크기 유형에 대한 사제 이름을 사용하지 마십시오. 제목에 표준 유형이 언급되어 있지만 코드에는 알 수없는 이름이 사용됩니다. – Olaf

답변

2

으로 :

formatted_data[data_length-2] = cmpId & 0xff; 
formatted_data[data_length-1] = cmpId >> 8; 

당신은 사용해야

cmpid = (payload[len-1] << 8) | payload[len-2]; 

하지 :

cmpid = (payload[len-2] << 8) | payload[len-1]; 
+1

@PaulR : OP는'memcpy'를 사용하지 않으므로 각면의 엔디안은 중요하지 않습니다! 각 측면의 컴파일러는 지정된 HW 아키텍처에 따라 비트 단위 연산을 구현합니다. –

+0

D' oh - 당신 말이 맞아요 - 내 코멘트를 지우 겠어. –

+1

@PaulR : 그 코멘트를하기 직전에, 나는 OP에 나 자신의 코멘트를 쓰려고했다. "여기서'memcpy'를 사용하지 않으면 코드가 플랫폼에 종속적이 될 것입니다. –