move 명령을 사용하여 레코드 값에 대해 1 바이트에서 문자열 변환으로 처리하지만 더 많은 값을 추가하면 가비지 값이 표시됩니다. 내가 시작하고 바이트 배열을 디코딩 중지하는 곳에서 어떤 색인을해야하지만 난 잘 모릅니다 생각레코드를 바이트 배열로 변환하고 델파이에서 값을 추출하는 방법은 무엇입니까?
showmessage(username);
// displays correct value if recepient_username is not encoded
showmessage(s);
procedure TForm1.encodeClick(Sender: TObject); // button click
var
obj2: pprotocol;
begin
new(obj);
new(obj2);
memo1.Lines.Add('encode click');
obj.username := 'ahmd';
obj.receipent_username := 'ali';
encode_packet(obj);
decode_packet(obj.arr);
end;
: 여기 코드는
interface
type
tcommand = (
cmd_login,
cmd_logout,
cmd_userinfo,
cmd_removeuser,
cmd_response
);
tprotocol = record
username: string;
receipent_username: string;
arr: tbytes;
case command_id: tcommand of
cmd_userinfo:
(username2: shortstring; ip: shortstring; port: word); // new info
cmd_response:
(status: boolean);
cmd_removeuser:
(username_remove: shortstring);
end;
pprotocol = ^tprotocol;
procedure encode_packet(obj: pprotocol);
procedure decode_packet(arr1: tbytes);
implementation
procedure encode_packet(obj: pprotocol);
begin
setlength(obj.arr, length(obj.username) * 2);
move(obj.username[1], obj.arr[0], length(obj.username) * 2);
setlength(obj.arr, length(obj.receipent_username) * 2);
// SetLength(Destination, SourceSize);
move(obj.receipent_username[1], obj.arr[1],
length(obj.receipent_username) * 2);
// problem starts from here
end;
procedure decode_packet(arr1: tbytes);
begin
setlength(username, length(arr1));
move(arr1[0], username[1], length(arr1));
setlength(s, length(arr1));
move(arr1[1], s[1], length(arr1));
end;
사용입니까? 아무도 날 바이트 배열에 문자열을 저장하는 방법을 설명 할 수 있습니다 (만약 내가 그렇게 내가 nil 값이 너무 섞여 있다면 하나의 색인 생성에서 문자열을 얻을 수있는 숫자와 일부 무효 값을 보았 디버그)