데이터를 서버로 전송을 해야 하는데.. 구조가 아래와 같습니다.
필드 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 인지 어찌 알수 있는지...
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;