이거이 안된다. 팀장님이 TTcpClient.sendln(String)과 TTcpServer의 receiveln(String) 을 이용해서 간단하게 통신하는 소스를 가져와서 보여주셨는데, 이거이 문자열이 깨진다.
만약 11을 보내면 서버에서 잘 받아지는데,
1111을 보내면 11만 제대로 오고 나머지는 쓰레기값이다.
그래서 String을 byte로 변환해서 byte로 보내려고 했는데,
이거이 String이 이상하게 값을 관리하고 있다.
만약 abcd 를 저장하고 있는 String 변수를 byte 배열로 변환해서 보면
97 0 98 0 99 0 100 0
이렇게 되어 있다. 오잉. 가운데 0은 모지.
하도 오랜만에 델파이를 만지니 원래 저랬나 싶기도 하고.
한국어로 쓰겠다고 하면 String이 원래 2바이트로 저장하나 싶기도 하고. 여튼 그렇다.
질문 1. 델파이에서 메모리 보는 거 원래 없었어? 왜 안보이지? 이게 없는데 내가 어떻게 델파이로 프로그램을 만들고 놀았을까..
그래서 AnsiString에 옮겨 담았다.
ansiStr := AnsiString(msg);
AnsiString에만 옮겨담아도
97 98 99 100
으로 잘 나온다.
문자열을 byte 배열로 옮겨담은 과정은 다음과 같다.
// byte 배열로 변환
for I := 0 to 255 do
arBytes[I] := 0;
ansiStr := AnsiString(msg);
nLength := length(ansiStr);
move(ansiStr[1], arBytes[0], nLength);
TcpClient1.SendBuf(arBytes, nLength);
그리고 서버에서는 OnAccept에서 이렇게 받아 처리했다.
var
s: AnsiString;
buffer: array [0..255] of byte;
I: Integer;
begin
LabeledEdit2.Text:=ClientSocket.RemoteHost;
for I := 0 to 255 do
buffer[I] := 0;
ClientSocket.ReceiveBuf(buffer, 256);
setLength(s, 256);
move(buffer[0], s[1], 256);
ListBox1.Items.Add(s);
setLength 함수도 웃기다. 저렇게 하고 나면 s에 쓰레기값이 잔뜩 채워진다. 아 이거 주소 바뀌었는지도 확인 안해봤네. 주소 바뀌고 쓰레기값으로 채워지면 할말 없고. (설마.. ㅎㅎ)
여튼 저렇게 했더니 이제 한글도 잘 된다. 한글 안되면 UTF-8로 변환하려고 했는데.
아 간만에 델파이 썼더니.. 거참.. 왜 메모리 보는 게 없을까. 있을꺼야. 있을껴. 있어야만해.
'프로그래밍 > 델파이' 카테고리의 다른 글
델파이 7 soap 웹서비스로 JBoss로 메시지 보낼 때 파라미터가 NULL로 넘어가는 에러 해결 (0) | 2017.01.05 |
---|---|
델파이 FastReport에서 페이지를 넘어가는 긴글을 제대로 보여주는 방법 (0) | 2012.08.11 |
Thumb만들때 jpeg 속도 빠르게 하기 (0) | 2007.04.18 |
Delphi에서 Activeform에서 F5를 눌러도 ActiveX폼이 먼저 액션을 취하도록 (0) | 2007.03.21 |
윈도우 환경변수 TEMP 찾아내기 (0) | 2006.11.16 |