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']
: 이렇게 되야 하는데요.. 위에서 보시는 것처럼 앞으로 두칸 밀려서 마지막에 널 값이 두자리 들어옵니다.
: 이걸 당췌 알수가 없는데요..
: 시간은 촉박하고,,, 아~ 이걸 우째야합니까?
:
: 고수님들... 좀 부탁드립니다.
|