2016-10-05 2 views
0

C++로 직렬 프로그램을 찾으려고합니다. 나는 여러 개의 uint8_t와 여러 개의 uint16_t로 구성된 char 배열을 보내고있다. 다른 쪽 끝은 처음 LSB와 난 그냥 '돈 몇 가지 이유로 16 비트 정수를 기대하고있다부호없는 int 변환 C++

buf[0]= var & 0xFF; buf[1]= var >> 8; 

buf[0]= (uint8_t)(var & 0xFF); buf[1]= var >> 8; 

이러한 차이는 (있는 경우) 무엇

char buf[3]; 
uint16_t var=1500; 

나는 예상 된 직렬 쓰기를 얻고 있다고 생각하지 않는다. 나는 이것이 일어날 수있는 많은 이유가 있음을 알고있다. 그러나 나는 단지 개념에 대한 나의 머리를 여기에서 감쌀려고 노력하고있다.

+0

다른 점은 무엇입니까? 그 중 하나는'uint8_t'에 대한 C 스타일의 캐스트를 포함하고 다른 하나는 그렇지 않습니다. 여기에 정말로 어떤 질문을 하시겠습니까? –

+1

이 "다른 끝"은 아마도 보낸 사람과 다른 엔디안을 사용합니까? – orphen

+0

나는 왜 당신이'var & 0xff'을하는지 궁금해. 암시 적/명시 적 캐스트가 이미 최상위 비트를 자르지 않습니까? –

답변

1

대부분의 직렬 프로토콜은 빅 엔디안 순서로 데이터를 원합니다. 이 경우 *reinterpret_cast<short*>(buf) = htons(var)을 수행하면됩니다. 리틀 엔디안이 정말로 필요한 경우 string/endian.h에 정의 된 htole16을 사용하십시오.

+0

정확합니다. 고쳤다. –

관련 문제