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

델파이 Q&A
Delphi Programming Q&A
[12931] Re:장성호님께 조용히 여쭈어 봅니다....(다른분들도 포함입니다.^^;;)
장성호 [nasilso] 1771 읽음    2009-10-05 23:34
IntToHex 랑은 좀 다릅니다.

Hex값 0x30 을 만들려면  16*3= 48 즉  문자열 "48"을 입력해야 IntToHex로  0x30으로 변환이 가능하죠

님께서 하고자 하는것은

문자열 "30"을   Hex값  0x30으로 변환하고자 하는것이지 않습니까?

이럴땐 IntToHex가 아니라  HexToBin 이라는 함수를 사용하면 됩니다.
HexToBin의 반대는   BinToHex이구요
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=919


Edit에 문자열을 다음과 같이 붙여서  "303132333435" 식으로 입력하셨으면

다음과 같이 Length를  2로 나누어서 처리해야 합니다.
procedure TForm1.Button1Click(Sender: TObject);
var
  buf: array [1..1024] of Char;
  outbuf: array [1..1024] of Char;
  str,outstr: String;
  len: Integer;
begin
  str:=Edit1.Text;
  len:=Length(str) div 2;
  HexToBin(PChar(str),@buf[1],len);
 //buf에 값을 .. SerialPort등으로 전송...

end;

그러면 buf에  0x30 0x31 0x32 0x33 0x34 0x35 값이 담기게 될것입니다.

만약 Edit에  space를 주고 싶거나 0x나  $표시같은 것을 하고 싶다면
HexToBin함수 호출하기 전에 모두 제거한 후에 호출해주면 될것입니다.

아니면 다음과 같이 VCL의 HexToBin함수를 수정하여
사용하시면 될것입니다.

다음 HexToBinEx 함수는 space로 문자가 구분되어있다고 판단하고
기존 HexToBin함수에서 Inc(Text, 2); 를 Inc(Text, 3);으로 살짝 수정한 것입니다.

function HexToBinEx(Text, Buffer: PChar; BufSize: Integer): Integer; assembler;
const
  Convert: array['0'..'f'] of SmallInt =
    ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
     -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,10,11,12,13,14,15);
var
  I: Integer;
begin
  I := BufSize;
  while I > 0 do
  begin
    if not (Text[0] in ['0'..'f']) or not (Text[1] in ['0'..'f']) then Break;
    Buffer[0] := Char((Convert[Text[0]] shl 4) + Convert[Text[1]]);
    Inc(Buffer);
    Inc(Text, 3); //space 1개로 구분되는경우
    Dec(I);
  end;
  Result := BufSize - I;
end;



위와같은 경우에는

Edit에 "3021334353"이런식으로 붙여쓸것이 아니라
다음과 같이 "30 21 33 43 53" 뛰워쓴후에 HexToBinEx를 호출해주면 될것입니다.


그럼...



오델로 님이 쓰신 글 :
: 일단 간략하게 설명드리겠습니다......
: cport통신이용할려고하는데요
:
: 에디트창을만들어서 입력받은값을 헥사로 바꿔서 쓸려고 하는데요 잘안되네요........
: 제가 장비로 보내고 싶은값은
: #$02#$30#$30#$42#$30#$30#$ㅁㅁ#$33#$67#$03;
: 또는#$02+#$30+#$30+#$42+#$30+#$30+#$30+#$ㅁㅁ+#$67+#$03;
: 입니다.....요걸 그냥 write써서 보내면 반응을 합니다. 문제는 이 값들이 바꿔주어야 한다는 겁니다.
:
: 예를 들어 텍스트창에 3을 입력하면 ㅁㅁ 자리에 hex값이 입력되게끔 구현하고 싶은데요
: 어찌하면될까요?
:
: 무작정물어보는건아니구요 제생각을 말씀드리면 일단 텍스트는 스트링으로 받으니 그걸 int로 변환한후 ㅁㅁ 자리에 넣주면 된다는 굉장히 어설푼 생각인데요 이리 하면 형변환문제가 발생하네요 pchar 이랑 안맞는다고......ㅡ.ㅡ;;; 소스 올려볼게요 수정이나 아니면 방법을 알려주세요...ㅡ.ㅡ
:
: var senddata: pchar;
:         s:string;
:        i:integer;
: begin
:      s:=edit1.text;                               <--------2자리 정수로 입력받아요 1-99 까지
:      mm:=strtoint(s);
:    
:    if com1.Connected=true then
:       begin
:     SendData:=#$02#$30#$30#$42#$30#$mm#$30#$33#$67#$03  
:     Com1.Write(sendData,Length(SendData));   
:      end;
:
:
: 이런식으로 하면될거같은데요....ㅡ.ㅡ mm을 헥사값으로 바꾸는거랑 inttohex(mm);<----맞나요
: 또 mm을 넣는 방법이랑 맞는지좀 봐주세요...ㅡ.ㅡ 너무 허접한걸로 질문드려 대단히 죄송합니다.ㅡ.ㅡ;;;;

+ -

관련 글 리스트
12930 장성호님께 조용히 여쭈어 봅니다....(다른분들도 포함입니다.^^;;) 오델로 1689 2009/10/05
12931     Re:장성호님께 조용히 여쭈어 봅니다....(다른분들도 포함입니다.^^;;) 장성호 1771 2009/10/05
12932         Re:Re:장성호님께 답변 감사드립니다..... 오델로 1311 2009/10/06
12933             Re:Re:Re:장성호님께 답변 감사드립니다..아 그리고 추가질문좀..... 오델로 1636 2009/10/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.