You copy with move command length*2 bytes on one side, but length only bytes on other side. If you use unicode strings, then you need to use length*2 bytes on the both sides.
Another problem here is that you copy two strings in one array, one by one. If you want to save both strings in one array, then you have to allocate enough of space inside array, also put information about length of strings and write content of both strings. Example how to put 2 strings into 1 array of bytes:
procedure test;
var
len: integer;
buf: array of byte;
a,b: string;
begin
a := 'try';
b := 'that';
// save
setlength(buf, SizeOf(Char)*(Length(a)+Length(b))+8);
len := length(a);
move(len, buf[0], 4);
len := length(b);
move(len, buf[4], 4);
move(a[1], buf[8], length(a)*SizeOf(char));
move(b[1], buf[8+length(a)*SizeOf(char)], length(a)*SizeOf(char));
// restore
a := '';
b := '';
move(buf[0], len, 4);
setlength(a, len);
move(buf[4], len, 4);
setlength(b, len);
move(buf[8], a[1], length(a)*SizeOf(char));
move(buf[8+length(a)*SizeOf(char)], b[1], length(a)*SizeOf(char));
end;
But i recommend you do not play with pointers and use any kind of serialization instead, for example memory streams.