C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[72049] Re:Re:Re:Re:Re:Re:Re:Re:Re:C++ 빌더 16진수 data 10진수 변환 문의 드려요..
김시환 [godson2] 4005 읽음    2014-11-27 17:57
이건 처리 방법이 있느냐, 없느냐의 문제가 아니라 다른 문제인듯 합니다.
아래 연산처리에서 13, 14 두개의 데이타중 상위바이트가 13이고 하위 바이트가 14 이기때문에 14번째가 음수인것 하고
최종 연산 결과의 temp 가 음수인것은 관계가 없습니다.

temp 값이 음수가 되려면 13번째 데이타가 음수여야 합니다.

뭔가 통신상에서 바이트가 밀렸거나, 데이타가 잘못 들어왔을 개연성이 오히려 큽니다.
temp 가 음수가 나왔을 경우 13번째 데이타가 뭐였는지 잘 확인해 보세요..



Rkluv 님이 쓰신 글 :
: 답변 굉장히 감사합니다.
: 현재 디버깅 중에 있으며, 답변자님의 답변에 큰 도움을 받고 있습니다.
:
: 말씀하신 바와 같이 13, 14 데이터가 합쳐져 33D8이 되어 양수값이 나오게 되는데.
: temp = 0x00FF & sResult2.c_str()[13];
:      temp <<= 8;                                                 // temp 에는 0x33 51이 저장이 됩니다.
:      temp = temp | sResult2.c_str()[14];           // 하지만  논리합 해주는 이곳에서 temp는 -40이 저장이 되어, 연산을 하지 않고
:                                                                                  -40이 저장이 됩니다.
:                                                                            // 14번쨰에 들어오는 Data가 2진수로 표현할때 최상위 Bit가 0 일 경우 무리없이
:                                                                                 연산을 해주어, [13][14] 0x---- 합쳐져 양수 값이 나오게 되는데,
:                                                                                 14번째에 들어오는 Data가 2진수로 표현될때 최상위 BIt가 1일 경우 연산을
:                                                                                하지 못하고 -Data가 결과값으로 나오게 됩니다.
: 이럴 경우 처리하는 방법에는 어떤 방법이 있을까요....
: 감사합니다.
:
:
: 김시환 님이 쓰신 글 :
: :
: : 14번째 데이타 값이 HEX로 0xD8 이고, 이걸 2진수로 바꾸면 1101 1000 입니다. 최상위 비트가 1이지요..
: : 데이타가 타입이 char 이므로 최상위 비트가 1이면 당연히 음의 값이 되는 겁니다.
: :
: : 진법 변환에 대한 내용은 디지탈관련 책을 보시면 알 수 있을 겁니다.
: :
: : 그리고 제가 장비 프로토콜을 몰라서 뭐라 말씀 드리기 어려운데.. 그동안의 질문을 봤을 때 데이타값이 넘어올 때
: : 2바이트로 넘어오는 듯 합니다. 그렇기 때문에 2바이트를 묶어서 1개의 데이타 값을 만드는 것입니다.
: :
: : 13,14번 데이타를 합쳐서 0x33D8 이 되면 이것은 2진수로 0011 0011 1101 1000 이 되고 최상위 비트가 0 이므로
: : 양수값이 되는 것입니다.
: :
: :
: :
: : Rkluv 님이 쓰신 글 :
: : : 안녕하세요... 답변 감사드립니다. 드디어 장비와 테스트를 진행하게 되었는데요..
: : :
: : : sMemo3->Lines->Add(sResult2);
: : :
: : :     temp = 0x00FF & sResult2.c_str()[13];
: : :     temp <<= 8;
: : :     temp = temp | sResult2.c_str()[14];
: : :
: : :     tpv = (temp / 100) - 100;
: : :
: : : 하지만 14번째에 들어오는 Data가 이상하게도 -Data가 나옵니다. 그러다 보니깐 올바른 연산을 하지 못하여,
: : : 애매한 Data를 리딩하게 됩니다.
: : :  33D8 이렇게 붙여서 한번에 10진수로 변환해보면 Data는 올바로 나오는데, 14번째 Data는 왜 -값으로 출력이 될까요.
: : :
: : :
: : : 정말 도움 많이 됫습니다. 감사합니다.
: : :
: : :
: : :
: : :
: : : 김시환 님이 쓰신 글 :
: : : : 아래 사용된 변수 중에서 sResult2 의 타입이 AnsiString 이네요..
: : : : AnsiString 이라서 당연히 에러가 발생하지요.. 문자열을 short 타입에 넣으므로 당연히 문제가 발생합니다.
: : : :
: : : : AnsiString  형이므로 아래처럼 수정하시던가
: : : :
: : : :  temp = 0x00FF & sResult2.c_str()[14];
: : : :  temp <<= 8;
: : : :  temp = temp | sResult2.c_str()[15];
: : : :
: : : :
: : : : 아니면 Read2(void) 함수 내부를 보시면
: : : : buffer 의 내용을 sResult2로 넣으셨는데 그렇게 하지 마시고 buffer가 전역으로 선언하신듯 한데
: : : :
: : : :  temp = 0x00FF & buffer[14];
: : : :  temp <<= 8;
: : : :  temp = temp | buffer[15];
: : : :
: : : : 그냥 이렇게 사용하시면 됩니다.
: : : :
: : : :
: : : : Rkluv 님이 쓰신 글 :
: : : : : 감사합니다. 하지만 제가 아래와 같이 CMD를 받고 읽는 함수를 쓰고 있습니다.
: : : : : GODSON님께서 말씀하신 코딩을 적용하면 첨부와 같은 형 에러가 발생합니다.
: : : : : 해결방법은 없는지요..? 아니면 다른 방법을 찾아봐야하는지요 ... 감사합니다.
: : : : :
: : : : : void __fastcall TForm1::WriteCmd2(AnsiString Write)
: : : : : {
: : : : :    strcpy(stringinput,Write.c_str());
: : : : :    status = viWrite (instr2, (ViBuf)stringinput, (ViUInt16)strlen(stringinput), &writeCount);
: : : : :    ErorrCheck();
: : : : : }
: : : : : bool __fastcall TForm1::ErorrCheck(void)
: : : : : {
: : : : :     if (status < VI_SUCCESS)
: : : : :     {
: : : : :         return false;
: : : : :     }
: : : : :     return true;
: : : : : }
: : : : : void __fastcall TForm1::Read2(void)
: : : : : {
: : : : :     memset(buffer,0,sizeof(buffer));
: : : : :     viRead (instr2, buffer, 5000, &retCount);
: : : : :     ErorrCheck();
: : : : :     sResult2 = AnsiString((char *)buffer);
: : : : : }
: : : : : void __fastcall TForm1::Chamberdata(void)
: : : : : {
: : : : :     AnsiString CMD;
: : : : :     float tpv;
: : : : :     float hpv;
: : : : :     short temp;
: : : : :     short hum;
: : : : :
: : : : :     CMD.sprintf("%c%s%c%c\n", 0x02, "002RCV", 0x03, 0x0D);
: : : : :     WriteCmd2(CMD);
: : : : :     Read2();
: : : : :     temp = 0x00FF & sResult2[14];
: : : : :     temp <<= 8;
: : : : :     temp = temp | sResult2[15];
: : : : :     tpv = (temp/100)-100;
: : : : :
: : : : :     hum = 0x00FF & sResult2[20];
: : : : :     hum <<= 8;
: : : : :     hum = hum | sResult2[21];
: : : : :     hpv = (hum/10);
: : : : :
: : : : :     sLabelFX15->Caption = tpv;
: : : : :     sLabelFX16->Caption = hpv;
: : : : : }
: : : : :
: : : : :
: : : : :
: : : : :
: : : : :
: : : : :
: : : : : 김시환 님이 쓰신 글 :
: : : : : : CMD.sprintf("%c%s%c%c\n", 0x02, "002RCV", 0x03, 0x0D);    -> 이 부분은 문제가 없습니다.
: : : : : :
: : : : : : 16진수 데이타를 10진수로 변경하는 것은 제 경우 저는 아래처럼 사용합니다.
: : : : : :
: : : : : : short temp ;
: : : : : :
: : : : : : temp = 0x00FF & Buffer[14]  ;
: : : : : : temp <<= 8 ;
: : : : : : temp = temp | Buffer[15] ;
: : : : : :
: : : : : : sLabelFX15->Caption = temp ;
: : : : : :
: : : : : : 사용하신 방법에는 문제가 많습니다. 컴파일은 되지만 실행하면 에러가 발생하게 됩니다.
: : : : : : 일단 사용한 변수가 전부 String Type 이기 때문에 사칙연산이 되지 않을 뿐더러 10진수로 바꿔지지도 않습니다.
: : : : : : 스트링은 스트링일 뿐 10진수 값은 아니기 때문입니다.
: : : : : :
: : : : : :
: : : : : : Rkluv 님이 쓰신 글 :
: : : : : : : 아아... 첫번째 인덱스에서 상대 길이 였군요... 감사합니다.
: : : : : : : 첨부파일은 컴아날라이저로 CMD를 날려서 데이터를 읽어 들였고, 결국 빨간 박스에 있는 값들을 받아 들여서 아래 코딩과 같이
: : : : : : : 작업을 한것입니다.
: : : : : : : 질문 1. 아래와 같이 CMD.sprintf("%c%s%c%c\n", 0x02, "002RCV", 0x03, 0x0D);를 변환 하였습니다.
: : : : : : :            이렇게 변환하여도 컴아날리이저에 02303032524356030D0A CMD를 날린 것과 같이 동일한 기능을 구현하는지...
: : : : : : : 질문 2. 들어온 Data들 중 빨간 박스의 값들을 취해 10진수로 제대로 바꾼 코딩인지,,,, 확인하고 싶습니다.
: : : : : : :
: : : : : : :  장비가 있어서 Test를 직접 하면 좋겠지만, 장비가 없어 제 생각만으로 코딩하기는 아직 실력이 너무 부족한것 같습니다 .
: : : : : : : 확인부탁드립니다.           
: : : : : : :
: : : : : : :
: : : : : : :    
: : : : : : :          AnsiString CMD;
: : : : : : :     AnsiString temp16;
: : : : : : :     AnsiString hum16;
: : : : : : :     AnsiString temp10;
: : : : : : :     AnsiString hum10;
: : : : : : :     AnsiString tpv;
: : : : : : :     AnsiString hpv;
: : : : : : :
: : : : : : :     CMD.sprintf("%c%s%c%c\n", 0x02, "002RCV", 0x03, 0x0D);
: : : : : : :     WriteCmd2(CMD);
: : : : : : :     Read2();
: : : : : : :     temp16 = sResult2.SubString(14,2);
: : : : : : :     hum16 = sResult2.SubString(20,2);
: : : : : : :     temp10 = StrToInt(temp16);
: : : : : : :     hum10 = StrToInt(hum16);
: : : : : : :     tpv = (temp10/100)-100;
: : : : : : :     hpv = (hum10/10);
: : : : : : :
: : : : : : :     sLabelFX15->Caption = tpv;
: : : : : : :     sLabelFX16->Caption = hpv;
: : : : : : :
: : : : : : :
: : : : : : :
: : : : : : :
: : : : : : : 송신영 님이 쓰신 글 :
: : : : : : : : SubString 의 두번째인자는 인덱스가아니라 첫번째 인자인 인덱스에의 상대 길이입니다.
: : : : : : : : 그리고 핵사값으로 "12"가 들어오면 앞에 "0x" 를 붙이고 StrToInt 하면됩니다.
: : : : : : : : 수신되는 데이터의 포멧이있어야 정확하게 알겠네요.
: : : : : : : :
: : : : : : : : Rkluv 님이 쓰신 글 :
: : : : : : : : : 안녕하세요 아래와 같이 문의드립니다.
: : : : : : : : :
: : : : : : : : : 장비에서 넘어오는 16진수 data를 10진수로 변환하려고 합니다.
: : : : : : : : :
: : : : : : : : : AnsiString CMD;
: : : : : : : : :    
: : : : : : : : :          AnsiString temp16;
: : : : : : : : :     AnsiString hum16;
: : : : : : : : :     AnsiString temp10;
: : : : : : : : :     AnsiString hum10;
: : : : : : : : :     AnsiString tpv;
: : : : : : : : :     AnsiString hpv;
: : : : : : : : :
: : : : : : : : :     CMD.sprintf("%c%s%c%c\n", 0x02, "002RCV", 0x03, 0x0D);
: : : : : : : : :     WriteCmd2(CMD);
: : : : : : : : :     Read2();
: : : : : : : : :     temp16 = sResult2.SubString(15,16);
: : : : : : : : :     hum16 = sResult2.SubString(21,22);
: : : : : : : : :     temp10 = StrToInt(temp16);
: : : : : : : : :     hum10 = StrToInt(hum16);
: : : : : : : : :     tpv = (temp10/100)-100;
: : : : : : : : :     hpv = (hum10/10);
: : : : : : : : :
: : : : : : : : :     sLabelFX15->Caption = tpv;
: : : : : : : : :     sLabelFX16->Caption = hpv;
: : : : : : : : :
: : : : : : : : : 컴파일 에러는 없는데 장비가 없어서 직접적으로 테스트는 못해보고 있습니다.
: : : : : : : : : 코드상 이상이 없는지 확인하고 싶습니다 . 감사합니다.
: : : : : : : : :

+ -

관련 글 리스트
71921 C++ 빌더 16진수 data 10진수 변환 문의 드려요.. Rkluv 4064 2014/10/27
71922     Re:C++ 빌더 16진수 data 10진수 변환 문의 드려요.. 송신영 4218 2014/10/27
71924         Re:Re:C++ 빌더 16진수 data 10진수 변환 문의 드려요.. Rkluv 4013 2014/10/29
71926             Re:Re:Re:C++ 빌더 16진수 data 10진수 변환 문의 드려요.. 김시환 3854 2014/10/29
71925             Re:Re:Re:C++ 빌더 16진수 data 10진수 변환 문의 드려요.. 김시환 4262 2014/10/29
71927                 Re:Re:Re:Re:C++ 빌더 16진수 data 10진수 변환 문의 드려요.. Rkluv 3910 2014/10/29
71928                     Re:Re:Re:Re:Re:C++ 빌더 16진수 data 10진수 변환 문의 드려요.. 김시환 3762 2014/10/29
72032                         Re:Re:Re:Re:Re:Re:C++ 빌더 16진수 data 10진수 변환 문의 드려요.. Rkluv 3611 2014/11/25
72034                             Re:Re:Re:Re:Re:Re:Re:C++ 빌더 16진수 data 10진수 변환 문의 드려요.. 김시환 3922 2014/11/25
72046                                 Re:Re:Re:Re:Re:Re:Re:Re:C++ 빌더 16진수 data 10진수 변환 문의 드려요.. Rkluv 3642 2014/11/27
72049                                     Re:Re:Re:Re:Re:Re:Re:Re:Re:C++ 빌더 16진수 data 10진수 변환 문의 드려요.. 김시환 4005 2014/11/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.