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
[11596] Re:[급질문] 소켓통신으로 전문내용을 받아 버퍼에 넣으면,,
kylix [] 2922 읽음    2007-11-13 18:10
Endian과 Align이 뒤섞여서 복합적으로 발생한 문제군요...

wSendDeviceSeq가 버퍼에 00 01 순서대로 들어가 있고 구조체로 그대로 복사하셨네요... 인텔계열에서는 메모리에 하위바이트부터 저장을 합니다. 때문에 wSendDeviceSeq는 0001이아닌 0100(256)로 해석이 되는겁니다.

또한 밀리는 것은 Align문제입니다. 기본적으로 빠른 속도를위해 4바이트정렬을 합니다. 이것때문에 예상하신것과 달리 레코드크기에 차이가나서 발생하는 문제입니다.  packed예약어를 쓰셔서 Align을 안하도록 하시면 됩니다.

TMsgHeader = packed record

철수 님이 쓰신 글 :
: 제가 VC++ 을 주로 사용하는 터라.
: 델파이로 만든 프로그램을 갑자기 수정하라는데,,
: 딱, 미치겠습니다.
: 고수님들의 급 조언 부탁드립니다.
: 내용은 아래와 같습니다.
:
: 소켓 통신중에 리시브 받은 내용을 버퍼에 올려서
: 그것을 특정 구조체에 넣는데요,
: 이게 자꾸 자릿수가 밀려서요.
:
: 버퍼 내용은  이렇게 들어옵니다. 정상적으로..
: [1] #174
: [2] #174
: [3] #174   --> 3byte 가 szTransactionCode
:
: [4] #1      --> 1byte 가  czSendDeviceType
:
: [5] #0
: [6] #1     --> 2 byte 가 wSendDeviceSeq
:
: [7] #5     --> 1 byte 가 czReceiveDeviceType
:
: [8] #0
: [9] #1    --> 2byte 가 wReceiveDeviceSeq      
:
: [10] #3
:
: [11] #0
: [12] #0
: [13] #0
: [14] #4
: ...............
:
: 아래가 구조체 내용인데요
:
:   TMsgHeader = record
:         szTransactionCode       : array[1..3] of char;
:         czSendDeviceType        : char;
:         wSendDeviceSeq          : Word;      
:         czReceiveDeviceType     : char;
:         wReceiveDeviceSeq       : Word;    
:         czCommandType           : char;
:         dwCommandKind           : Longword;
:         dwDataLength            : Longword;
:         szPrepareFilter         : array[1..20] of char;
:         szSendTime              : array[1..14] of char;
:   end;
:
: 이게 버퍼에서 구조체로 메모리 복사를 하고 나면
: buffer : array [1..1024] of Char;
: ZeroMemory( @buffer, 1024 );
: CopyMemory( @MsgHeader, @buffer, sizeof(MsgHeader) );
: 이렇게 코드를 통화하면,,
:
: szTransactionCode       [#174, #174, #174]
: czSendDeviceType        #1
:  wSendDeviceSeq         256
: czReceiveDeviceType     #5
: wReceiveDeviceSeq       769
: ......
: szSendTime   ['0','7','1','1'.............#0,#0 ]
:
: 이렇게 되버립니다.
: wSendDeviceSeq   이놈의 값이 256 이라고 나오는데,, 이게 무슨 뜻입니까?
:
: szSendTime   요넘 값이 정상적으로 들어오면 ['2','0','0','7', ....... '5','3']
: 이렇게 되야 하는데요.. 위에서 보시는 것처럼 앞으로 두칸 밀려서 마지막에 널 값이 두자리 들어옵니다.
: 이걸 당췌 알수가 없는데요..
: 시간은 촉박하고,,, 아~ 이걸 우째야합니까?
:
: 고수님들... 좀 부탁드립니다.

+ -

관련 글 리스트
11595 [급질문] 소켓통신으로 전문내용을 받아 버퍼에 넣으면,, 철수 1870 2007/11/13
11598     Re:[급질문] 수신된 값..... 철수 1673 2007/11/13
11596     Re:[급질문] 소켓통신으로 전문내용을 받아 버퍼에 넣으면,, kylix 2922 2007/11/13
11597         Re:Re:[급질문] kylix 님 정말 감사합니다. 철수 1578 2007/11/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.