如何在Delphi 7中将分段数据存储到单个变量中?
实现客户端累积接收Base64字符串到单个变量
要把多次接收的Base64数据片段整合到一个变量中,只需通过类成员变量持久化存储累加结果,再在每次收到数据时将片段追加进去即可,具体实现如下:
步骤1:添加类成员变量
在TFrmClient类的private区域,新增一个用于存储完整Base64数据的字符串变量:
type TFrmClient = class(TForm) ClientSocket: TClientSocket; ClientBasefile: TMemo; // ... 其他已声明的组件 procedure ClientSocketRead(Sender: TObject; Stream: TStream); private FReceivedBase64: string; // 用于累积所有Base64片段的变量 public // ... 公共方法/属性 end;
步骤2:修改Socket读取事件逻辑
修改ClientSocketRead方法,将每次接收的Base64片段追加到FReceivedBase64变量中(如果需要保留每段数据的日志,仍可以继续往Memo里添加):
procedure TFrmClient.ClientSocketRead(Sender: TObject; Stream: TStream); var zb_St: String; begin Log(Sender, 'Data received from socket'); with Stream as TMemoryStream do begin SetLength(zb_St, Size); Read(zb_St[1], Size); end; if Sender = ClientSocket then begin // 将新接收的片段追加到累积变量 FReceivedBase64 := FReceivedBase64 + zb_St; // 可选:保留每段数据的日志记录 ClientBasefile.Lines.Add(zb_St); end; end;
后续使用示例
当需要完整的Base64字符串时,直接调用FReceivedBase64变量即可,比如保存到文件:
procedure TFrmClient.btnSaveFullDataClick(Sender: TObject); begin if FReceivedBase64 <> '' then TFile.WriteAllText('complete_base64.txt', FReceivedBase64); end;
优化提示
如果接收的Base64数据量极大,建议用TStringBuilder替代字符串拼接,提升性能:
- 替换类成员变量:
private FReceivedBase64: TStringBuilder;
- 在窗体创建/销毁时初始化/释放:
procedure TFrmClient.FormCreate(Sender: TObject); begin FReceivedBase64 := TStringBuilder.Create; end; procedure TFrmClient.FormDestroy(Sender: TObject); begin FReceivedBase64.Free; end;
- 接收时追加数据:
FReceivedBase64.Append(zb_St);
- 获取完整字符串:
var FullBase64 := FReceivedBase64.ToString;
内容的提问来源于stack exchange,提问作者Syed ZBK
相关产品推荐
相关产品推荐

