首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Oxygene中从Delphi流加载字符串

在Oxygene中从Delphi流加载字符串
EN

Stack Overflow用户
提问于 2014-07-27 12:53:20
回答 2查看 338关注 0票数 1

我是Oxygene的新手,我想从Delphi生成的流中读取字符串。我通过TCP接收这个流。下面是如何将字符串保存到客户端的流中:

代码语言:javascript
复制
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)加载字符串的方法如下所示:

代码语言:javascript
复制
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位)。对于目标C,我找到了这个代码

代码语言:javascript
复制
- (int32_t)readInt32
{
    int32_t value = 0;

    if ([self read:(uint8_t *)&value maxLength:4] != 4)
    {
        NSlog(@"***** Couldn't read int32");
    }
    return value;
}

这是Oxygene代码:

代码语言:javascript
复制
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;

但出了点问题,我没有任何价值。你们知道我该怎么做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-28 04:59:48

我认为您不正确地转换了Objective代码(稍微有点,但很明显):

代码语言:javascript
复制
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;

在上面的代码中,tmp声明为单个字节,并使用变量的地址类型转换进行初始化。

因此,如果变量存储在内存地址$12345678 (为简洁起见,将愚蠢的示例保持为32位),那么tmp将被初始化为值$78。然后将aStream.read()传递tmp变量的地址,后者尝试将4个字节读入tmp变量的位置。但是tmp只是一个1字节的值!

我认为您需要更改tmp的声明,使其成为指向unit8_t指针,然后将其直接传递给

代码语言:javascript
复制
  var value: int32_t := 0;
  var tmp:= ^uint8_t(@value);
  if aStream.&read(tmp) maxLength(4) <> 4 then
    NSLog('***** Couldn''t read int32'); 

或者消除tmp变量,并通过适当的强制转换直接传递值的地址:

代码语言:javascript
复制
  var value: int32_t := 0;
  if aStream.&read(^uint8_t(@value)) maxLength(4) <> 4 then
    NSLog('***** Couldn''t read int32'); 

后一种方法更直接地与目标C原始相比较。

票数 0
EN

Stack Overflow用户

发布于 2014-07-28 06:35:05

您需要先读取长度,然后读取UTF-8编码的字节.我根本不知道Oxygene,但代码可能是这样的:

代码语言:javascript
复制
var len: Integer:= 0;   
aStream.&read(len) maxLength(sizeof(Integer));
var buf := new uint8_t[len];
aStream.&read(buf) maxLength(len);

我完全希望我有错误的语法,但这是一般的想法!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24981155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档