stream中有一个字节是整数,我想把它读出来,放进一个integer变量中,怎么做?

cdchq 2013-02-06 12:27:51
stream中有一个字节是整数,我想把它读出来,放进一个integer变量中,怎么做?

还有一个问题
stream中比如从5字节开始,是一个5位的字条串"abcde",我想把它读出来放进一个string变量中,怎么做?
...全文
810 13 点赞 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
simonhehe 2013-02-06
var
  strm : TStringStream;
  s : string;
begin
  strm := TStringStream.Create;
  try
    strm.WriteString('1ab3c');  //写入字符串   
    strm.Position := 0;    //设定读取位置
    s := strm.ReadString(1); //参数为读取的长度

    //s为读取的结果, lz根据情况作类型转换即可
  finally
    strm.Free;
  end;
end;
  • 打赏
  • 举报
回复
cdchq 2013-02-06
引用 1 楼 simonhehe 的回复:
Delphi/Pascal code?1234567891011121314var strm : TStringStream; s : string;begin strm := TStringStream.Create; try strm.WriteString('1ab3c'); strm.Position := 0;// strm.Posit……
这是字符串,integer的呢?
  • 打赏
  • 举报
回复
simonhehe 2013-02-06
var
  strm : TStringStream;
  s : string;
begin
  strm := TStringStream.Create;
  try
    strm.WriteString('1ab3c');
    strm.Position := 0;
//    strm.Position := 3;
    s := strm.ReadString(1);
  finally
    strm.Free;
  end;
end;
  • 打赏
  • 举报
回复
simonhehe 2013-02-06
引用 5 楼 cdchq 的回复:
stream中有一个字节是整数,我想把它读出来,放进一个integer变量中,怎么做? 这问题还没人来答
类似下边的代码 --------------- var s : string; n : integer; begin s := strm.ReadString(1); //读出字符存入s if s 是字符 then n := strtoint(s); end;
  • 打赏
  • 举报
回复
cdchq 2013-02-06
stream中有一个字节是整数,我想把它读出来,放进一个integer变量中,怎么做? 这问题还没人来答
  • 打赏
  • 举报
回复
静_海 2013-02-06
用 stream 处理结构化数据需要编码解码,每段数据由 head 和 body 组成。head 是定长的,用来标志数据类型和长度(或许还有应用所需的其他标志),body 包含数据本身。读 stream 时,总要先读出 head,然后根据其中的标志读 body。因为 head 中有长度标志,所以这样一路读下去也不会错位。像多媒体流那是很复杂的编码,只要读写都遵循同样的规范就不会出错。
  • 打赏
  • 举报
回复
静_海 2013-02-06
感觉 ss.Write(a1,sizeof(a1)) 这种写法似乎有问题。a1 在这里是数组地址。按 Delphi 的定义,这里应该是变量,由编译程序把它转换成地址。是否可以改成 ss.Write(a1[0],sizeof(a1))?其实可以不用数组,直接把一个四字节整数写进去就行。 再者,你从 position = 2 开始读,只剩两个字节可以读出了。iC 是四字节的,这样高位两个字节没有被覆盖,iC 又未初始化,其初值未必是 0。
  • 打赏
  • 举报
回复
cdchq 2013-02-06
const a1:array[0..3] of Byte=($00,$00,$00,$12); var ss:TStringStream; iC:Integer; begin ss:=TStringStream.Create(''); try ss.Write(a1,sizeof(a1)); ss.Position:=2; ss.Read(iC,sizeof(Integer)); finally ss.Free; end; ShowMessage(IntToStr(iC)); end; iC应该=18,但运行下来iC是个很大的数字
  • 打赏
  • 举报
回复
静_海 2013-02-06
噢,你的结果不对呀。不妨把这个流保存到文件中(最好就写个小整数,别的不写),然后看看文件的二进制码,应该就是你写的整数值(不是 ASCII 码),而且是四个字节。要不是这样,那就是写错了。
  • 打赏
  • 举报
回复
cdchq 2013-02-06
引用 9 楼 jinghai1776 的回复:
从 stream 读 Integer 很容易。假如 Strm 是 TStream,N 是 Integer,则: Strm.Read(N, SizeOf(N)); // 整数读到变量 N 中 当初必须是这样把整数写进 stream 中去: Strm.Write(N, SizeOf(N)); 即使是 record 类型,也可以这样读写。当然,record……
我试过这样,但我的结果怎么不对呢?
  • 打赏
  • 举报
回复
静_海 2013-02-06
从 stream 读 Integer 很容易。假如 Strm 是 TStream,N 是 Integer,则: Strm.Read(N, SizeOf(N)); // 整数读到变量 N 中 当初必须是这样把整数写进 stream 中去: Strm.Write(N, SizeOf(N)); 即使是 record 类型,也可以这样读写。当然,record 内部成员必须定长。如果有不定长数组和字符串之类的变量,就会读错。
  • 打赏
  • 举报
回复
simonhehe 2013-02-06
引用 7 楼 cdchq 的回复:
引用 6 楼 simonhehe 的回复:引用 5 楼 cdchq 的回复:stream中有一个字节是整数,我想把它读出来,放进一个integer变量中,怎么做? 这问题还没人来答 类似下边的代码 --------------- var s : string; n : integer; begin s := strm.ReadStrin……
var
  strm : TStringStream;
  s : string;
  n : integer;
begin
  strm := TStringStream.Create;
  try
    strm.WriteString('1ab3c');  //写入字符串   
    strm.Position := 0;    //设定读取位置
    s := strm.ReadString(1); //参数为读取的长度
    //已知s的值为'1', 所以直接转整形了, 实际应用中不能这么干
    n := strtoint(s);  
  finally
    strm.Free;
  end;
end;

  • 打赏
  • 举报
回复
cdchq 2013-02-06
引用 6 楼 simonhehe 的回复:
引用 5 楼 cdchq 的回复:stream中有一个字节是整数,我想把它读出来,放进一个integer变量中,怎么做? 这问题还没人来答 类似下边的代码 --------------- var s : string; n : integer; begin s := strm.ReadString(1); //读出字符存入s i……
这个结果明显不对
  • 打赏
  • 举报
回复
相关推荐
发帖
语言基础/算法/系统设计
加入

1.6w+

社区成员

Delphi 语言基础/算法/系统设计
申请成为版主
帖子事件
创建了帖子
2013-02-06 12:27
社区公告
暂无公告