Q&A

  • 아래의 내용[데이터 형변환] 다시 질문입니다.
데이터를 서버로 전송을 해야 하는데.. 구조가 아래와 같습니다.

필드     Length          Type                                  데이타
                                                           Hexa                   Data
  A         4 byte         String              41  42  43  44         ABCD
  B         4 byte         String              30  31  33  31          0131
  C         4 byte      unsigned            00  00  00  04          4byte
                                                        00  00  00  32         50byte
                                                        01  50  00  00         21Mbyte
                                                        1f  f0  00  00         511Mbyte
  D           가변             String              

이런 구조로 TCPIP통신을 해야합니다.
문제는 C 필드인데.. C는  이후의 실 데이터의 길이를 표현합니다.
D필드 가변데이터의 길이가 50 일때 Hexa값을 보면  00 00 00 32로 나오죠.. IntToHex(C, 8) 이런식으로보면  근데 전송을 하려면 어쨌듯 A + B + C + D를 해서 보내야하는데
필드 C를 어떻게 4byte형태로 만들어야 하는지...ABD는 어차피 문자열이니 상관없구...
어떤 방법이 있나요?

최용일님께서 말씀하신데로 동적배열로 잡으면 되는데요...
동적배열도 어차피 데이터형이 있구요... array of char 로 선언했을 경우
필드 C의 처리를 어찌해야 하는지 그게 궁금한거 였습니다.

또한 서버쪽에서 4byte 끊어서 읽었을 경우 이게 위의 예처럼 길이가 50 인지 어찌 알수 있는지...

2  COMMENTS
  • Profile
    최용일 2008.12.03 07:21
    쩝~ 왜 꼭 4바이트 형태로 만들어야 된다고 생각하시는지요?
    Byte든 Char 이든, 16진수이든 10진수이든 우리 눈에 보이는 차이일뿐이지 컴퓨터 입장에서는 똑같은 수입니다. 우리가 눈으로 해석만 다르게 할 뿐입니다.


    var
    A, B, D: string;
    C1, C2, C3, C4: LongWord;
    TCPData: array of Byte;
    TCPDataSize: Integer;
    TCPDataPos: Integer;
    begin
    A := 'ABCD';
    B := '0131';
    C1 := 4;
    C2 := 50;
    C3 := 21 * 1024 * 1024; // = $01500000
    C4 := 511 * 1024 * 1024; // = $1FF000
    D := 'variable string data';

    // Calculate data size & allocate memory
    TCPDataSize := Length(A) + Length(B) + SizeOf(C1) + SizeOf(C2) + SizeOf(C3) + SizeOf(C4) + Length(D);
    SetLength(TCPData, TCPDataSize);

    TCPDataPos := 0;
    // Put A
    Move(A[1], TCPData[TCPDataPos], Length(A));
    Inc(TCPDataPos, Length(A));
    // Put B
    Move(B[1], TCPData[TCPDataPos], Length(B));
    Inc(TCPDataPos, Length(B));
    // Put C1
    Move(C1, TCPData[TCPDataPos], SizeOf(C1));
    Inc(TCPDataPos, SizeOf(C1));
    // Put C2
    Move(C2, TCPData[TCPDataPos], SizeOf(C2));
    Inc(TCPDataPos, SizeOf(C2));
    // Put C3
    Move(C3, TCPData[TCPDataPos], SizeOf(C3));
    Inc(TCPDataPos, SizeOf(C3));
    // Put C4
    Move(C4, TCPData[TCPDataPos], SizeOf(C4));
    Inc(TCPDataPos, SizeOf(C4));
    // Put D
    Move(D[1], TCPData[TCPDataPos], Length(D));

    // Send TCPData variable to Server
    ......
    end;
  • Profile
    cell 2008.12.04 22:31
    최용일님 말씀처럼 너무 4바이트에 연연했나보네요 ^^
    잘해겼됐습니다.
    • 김길현
    • 2008.12.05 01:45
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.05 01:05
      추측하자면... UDP1.GetMessage(str);에서 타임아웃되어서 종료되고 이 때문에 str에는 아무 값도 설정...
    • absurdite
      2008.12.05 02:22
      앗! 딱 맞습니다ㅡㅜ UDP1.GetMessage(str); if (not (str = '')) then Memo1.Lines.Add(str); ...
    • cell
    • 2008.12.04 23:22
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.05 00:55
      보내는 부분에서 잘못된 곳이 있네요... 동적 배열 (array of ...)은 포인터형입니다. 실제 데이터는 다...
    • cell
      2008.12.05 01:24
      맞네요... 동적배열이 포인터형인데... 먼짓을 한건지...^^ 감사합니다.
    • 별이^^
    • 2008.12.04 18:51
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이건희
    • 2008.12.03 20:59
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 장성호
      2008.12.03 22:08
      Timer를 이용해보세요 1. OnMouseDown이벤트에서 1.1 레이블의 숫자를 증가시키세요 ...
    • 까마귀
      2008.12.03 23:26
      흠... 아마 메인폼 실행후에 로그인 창이 뜨도록 만들어져 있는 것 같네요. 그리고, 메인폼 실행시 쿼...
    • 이정욱
      2008.12.03 12:57
      클래스를 사용하면 좋겠지만, 만약 네트웍이나 시리얼을 통해 자료를 주고 받는 다면 packed record를 사...
    • 이은주
      2008.12.03 15:45
      아 그럼 동일한 환경이라면 클래스를 쓰는 것이 유리하고 정보를 전송하는 경우는 packed record 가 유리...
    • 김명민
    • 2008.12.03 06:10
    • 0 COMMENTS
    • /
    • 0 LIKES
    • cell
    • 2008.12.03 04:38
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.03 07:21
      쩝~ 왜 꼭 4바이트 형태로 만들어야 된다고 생각하시는지요? Byte든 Char 이든, 16진수이든 10진수이든...
    • cell
      2008.12.04 22:31
      최용일님 말씀처럼 너무 4바이트에 연연했나보네요 ^^ 잘해겼됐습니다.
    • Jackie
    • 2008.12.03 03:09
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.03 03:25
      왜 겹치려고 하는지는 모르겠지만.... TLabel은 절대 TPageControl위로 올라갈 수가 없습니다. TLabel...
    • Jackie
      2008.12.03 03:43
      님의 덕분에 해결을 하였습니다. 정말 감사합니다. 두 콤포넌트가 겹치는것은 대면부구성상 탭오른...
    • 장성호
      2008.12.03 04:02
      TLabel 과 TSpeedButton은 Graphic-Control(윈도우핸들이 없는놈)입니다. 그리고 TPageControl 과 TSt...
    • 꼬꼬마
    • 2008.12.02 21:50
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.02 22:39
      아래와 같이해서 함수를 하나 만들어 쓰세요. 1. 년도와 월 가지고 그달의 1일을 구하세요. (EncodeDate...
    • 꼬꼬마
      2008.12.02 23:44
      휴...;;; 무슨 말인지는 알겠는데요;; 아직 델 초보라서;;; 이것저것 계속 해보고 있는데;;;;; ...
    • 장성호
    • 2008.12.02 23:53
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 꼬꼬마
      2008.12.03 00:53
      장성호님..최용일님.. 두분 감사합니다..;; 몇일째 고생했던게;;;; 시원하게 풀렸네요... 여기서 멈...
    • cell
    • 2008.12.02 06:16
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.02 18:58
      동적 배열을 사용해보세요. A+B+C+D만큼의 크기를 동적배열로 잡고 거기에 데이터를 넣어서 전송하시면 ...
    • 꼬꼬마
    • 2008.12.01 22:10
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.02 02:14
      뭐가 잘 안된다는 것인지.... 그냥 for문으로 원하시는 주를 삽입하시면 될것 같은데요...
    • 꼬꼬마
      2008.12.02 04:01
      어떤 식으로... for문을 돌려야 하는건가요? 이거..그냥 계속 제자리 걸음을 하는거 같네여;; ㅠㅜ
    • 장성호
      2008.12.02 05:03
      벌써 여러번 같은 질문 올리셨죠? 이곳 말고 델마당에도... http://www.delphi.co.kr/zboard/view....
    • 조일현
    • 2008.12.01 21:16
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.12.02 02:16
      뭘 그렇게 숨기시려고 하시는지... 'zzzzzz'이란 에러메세지에 해답이 있습니다. 잘 분석해보세요.
    • 아르스
      2008.12.02 19:09
      ^^
    • 조일현
      2008.12.07 20:36
      감사합니다~~
    • 백록화
      2008.12.01 19:52
      흠... DataSet - DataSource - DbGrid 이렇게 연결되어 있는 상태에서 DbGrid 의 Row가 변경이 되...
    • 델파이쌩초보
      2008.12.02 00:55
      백록화님 먼저 관심이 갖고 답변을 해주셔서 너무 감사드립니다. 진작 들어와봤으면 좋았을껄.. ㅎㅎ ...
    • 백록화
      2008.12.02 04:14
      네...각 콤포넌트들 (TDataSet, TDataSource, TDbGrid) 는 서로 유기적으로 묶여져 있습니다. 따라서 어...
    • 델파이쌩초보
      2008.12.04 20:34
      백록화님 정말 감사드립니다. 한번에 정확히 이해를 못하고는 있지만.. 약간 감은 오는 것 같습니다. ...
    • 유경민
    • 2008.11.29 22:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • safebear
      2008.12.01 19:07
      자료실에 원하시는게 있네요 ^^ http://www.delphi.co.kr/zboard/view.php?id=component&page=1&sn1=&...