【发布时间】:2014-07-27 12:53:20
【问题描述】:
我是 Oxygene 的新手,我想从 Delphi 生成的流中读取字符串。我通过 TCP 接收这个流。 以下是我如何将字符串保存到客户端的流中:
procedure SaveStringToStream(AStream: TStream; AString: String);
var
StringSize: Integer;
StringToSave: AnsiString;
begin
StringToSave := Utf8Encode(AString);
StringSize := Length(StringToSave);
AStream.WriteBuffer(StringSize, SizeOf(StringSize));
AStream.WriteBuffer(Pointer(StringToSave)^, StringSize);
end;
如您所见,我首先将字符串的大小添加到流中,然后添加内容。 我现有的从服务器端(Oxygene)的流中加载字符串的方法如下所示:
function LoadStringFromStream(const aStream: NSInputStream): String;
begin
var buf: array[1024] of uint8_t;
var len: Integer:= 0;
len := aStream.&read(buf) maxLength(1024);
if len > 0 then
begin
nslog(len.stringValue);
var data: NSMutableData := NSMutableData.alloc().initWithLength(0);
data.appendBytes(@buf) length(buf[0]);
exit NSString.alloc().initWithData(data) encoding(NSStringEncoding.NSASCIIStringEncoding);
end;
end;
但这会返回孔的内容,而不是当前部分。
编辑: 哦,我在服务器应用程序中出错了……现在我可以读取字符串,但不能读取整数值(最多只能读取 256 位)。对于 Objective-C,我找到了这段代码
- (int32_t)readInt32
{
int32_t value = 0;
if ([self read:(uint8_t *)&value maxLength:4] != 4)
{
NSlog(@"***** Couldn't read int32");
}
return value;
}
那是氧气密码:
function readInt32(const aStream: NSInputStream): Integer;
begin
var value: int32_t := 0;
var tmp:= uint8_t(@value);
if aStream.&read(@tmp) maxLength(4) <> 4 then
NSLog('***** Couldn''t read int32');
exit value;
end;
但是出了点问题,我没有得到任何价值。你们知道我要做什么吗?
【问题讨论】:
标签: delphi oxygene remobjects