Float Char 배열 byte형태로 bit연산하여 변환
간혹가다 프로토콜형태로 Char배열에 Byte형태로 전송하고 받아야 하는경우
long short 같은경우 비트 연산이 가능하지만 float 같은경우 비트연산이 불가능하다.
//샘플로 char배열과 float값 설정
char _charArray[4];
float _floatValue = 12345.6789F;
//변환 전 값 체크
printf( " \n %10.5f " , _floatValue ) ;
//float 값을 unsigned log 으로 변환하여 한바이트씩 비트연산으로 배열에 집어 넣는다.
_charArray[0] = (char)(*((unsigned long*)&_floatValue ) >> 24);
_charArray[1] = (char)(*((unsigned long*)&_floatValue ) >> 16);
_charArray[2] = (char)(*((unsigned long*)&_floatValue ) >> 8);
_charArray[3] = (char)(*((unsigned long*)&_floatValue ));
//char배열에 집어넣은 값을 unsigned long 에 집어넣는다.
//여기서 & 0xFF를 제거할경우 부호 확장이 발생하여 값이 제대로 출력되지 않는다.
unsigned long _longValue = (((unsigned long)_charArray[0]&0xFF) << 24);
_longValue+= (((unsigned long)_charArray[1]&0xFF) << 16) ;
_longValue+= (((unsigned long)_charArray[2]&0xFF) << 8) ;
_longValue+= (((unsigned long)_charArray[3]&0xFF));;
//가져온값을 float로 변환한다.
float fData = *((float*)&_longValue);
//변환후 값 출력
printf( " \n %10.5f " , fData ) ;
이방법 말고 union을 사용하는 방법도 있다.
//union으로 float와 unsigned log 을 선언한다.
union {
unsigned long l;
float f;
}u1,u2;
//u1구조체의 float에 값 삽입 ( unsigned log 에도 자동으로 값 삽입)
u1.f = 1234.56789F;
//삽입된 값 출력
printf( " \n %10.5f " , u1.f ) ;
//위에 예제와 다르게 부호확장을 위해서 unsigned char로 선언했다
//unsigned char일경우 부호가 없기 때문에 부호확장시 전부 0을 채워넣는다. 그래서 &0xFF가 필요 없다.
unsigned char c[4];
c[0] = u1.l >> 24;
c[1] = u1.l >> 16;
c[2] = u1.l >> 8;
c[3] = u1.l;
u2.l = c[0]<< 24;
u2.l |= c[1]<< 16;
u2.l |= c[2]<< 8;
u2.l |= c[3];
//u2.l = (c[0] & 0xFF) << 24;
//u2.l |= (c[1] & 0xFF) << 16;
//u2.l |= (c[2] & 0xFF) << 8;
//u2.l |= (c[3] & 0xFF);
printf( " \n %10.5f " , u2.f ) ;
'Programming Lv1 > MFC' 카테고리의 다른 글
CString을 char*로 변경 (0) | 2011.10.17 |
---|---|
배열 동적 할당 및 배열 개수 (0) | 2011.08.26 |
MFC MDI 창에 메세지 보내기 (0) | 2011.08.16 |
MFC 새창열기 변경 (0) | 2011.08.16 |
MFC Pane 닫기버튼 미사용시 레지스트리 초기화 (1) | 2011.08.16 |