请教:关于字符数组,string,的读写转换。 ( 积分: 100 )

  • 主题发起人 主题发起人 cjsam
  • 开始时间 开始时间
C

cjsam

Unregistered / Unconfirmed
GUEST, unregistred user!
如下定义:
var
st:array[0..99] of char;
str,str1:string;
il:integer;
DMemory:TMemoryStream;
a:byte;
i:array[0..9]of char;
t:array[0..3] of byte ;
begin
str:='0123456789';
st[0]:=char(11);
st[1]:=char(loByte(26));
st[2]:=char(hiByte(26));
st[3]:=char($c0);
st[4]:=char($a8);
st[5]:=char($01);
st[6]:=char($01);
for il:=0 to 9 do
st[7+il]:=str[il];
{
st[]中的值应该是:(#11, #26, #0, #192, #168, #1, #1, #0, '0', '1', '2', '3', '4', '5', '6', '7', '8',。。。。。。。)
}

str1:=Format('%s',[st]);//首先想把转换成字符串处理。这的转换好象有问题,
明明那样多的,转换后就很短的一个字符串了,
//{

。。。。。中间有许多其他处理。。。。。。。。

}
//现在开始读上面转换的字符串。
DMemory:=TMemoryStream.create;
DMemory.Write(str1[1],length(str1));

DMemory.Position:=0;
DMemory.Seek(3,soFromBeginning);
DMemory.Read(t,4);
DMemory.Seek(7,soFromBeginning );
Dmemory.Read(i,10);
DMemory.Free;
end;
//读出来的,t,i更本不是对应:#192, #168, #1, #1 和 #0, '0', '1', '2', '3', '4', '5', '6', '7', '8',

请问到底需要怎样处理呀??谢谢大家
 
大家帮帮忙看看呀
 
st[]中的值应该是:(#11, #26, #0, #192, #168, #1, #1, #0, '0', '1', '2', '3', '4', '5', '6', '7', '8',。。。。。。。)
--------------------------------------------------------------------------------
怎么可能会有这么多的值?
 
OK。
首先,因为在 str1:=Format('%s',[st]) 的操作中,已经导致了字符串出了问题,所以先
要解决这个问题,以便于完整地保留数据信息。为此,我们可以把 st:array[0..99] of char
改变定义为 st:array[0..99] of Byte 。这二者所能存放的数据是相同的。
经过这个定义后,st[7+il]:=str[il] 的操作就变成了 st[7+il]:=Ord(str[il])。数据信
息将被完整地保留到了 st 数组。

之后,TMemoryStream 的操作就会成功。但是因为同样的问题,在从 TMemoryStream 中取
出数据时,如果用 Char 变量类型存放取出的数据,在转换为显示 Str 的时候,其中遇到
0 的位置时,数据依然会被当作字符串结束标志而被截断。为此,你同样只要稍作一些处
理,就可以避免这个问题,也即:不要用 Char 去存放。
 
st[0]:=char(11);
st[1]:=char(loByte(26));
st[2]:=char(hiByte(26));
st[3]:=char($c0);
st[4]:=char($a8);
st[5]:=char($01);
st[6]:=char($01);
for il:=0 to 9 do
st[7+il]:=str[il];
{
st[]中的值应该是:(#11, #26, #0, #192, #168, #1, #1, #0, '0', '1', '2', '3', '4', '5', '6', '7', '8',。。。。。。。)
}
这个是数组,怎的不是呀。
应该是:st[0]:=#11,st[1]=#26,...........
定义的是st:array[0..99] of char;应该有100个呀,后面没有是些乱的数据,只有st[0]-st[16]我赋值了的。
现在我想把它转换成string ,但是转换后,在用流把读回来的时候就丢了很多东西,到底怎样做呢?
 
:小雨哥
那我后面怎样把BYTE数组转换成str1呀
这样用:str1:=strpas(pchar(@st)).

我需要把str1经过一些处理,不如加上其他的字符串:比如。str1:='abcdef'+str1.所以必须需要把BYTE数组转换成一个string来做,然后才用流去取出来。
请指教
 
理论上,字符串数据中出现 #0 的字符的位置,就标识该串结束的位置。因此,类似您这样
的数据要完整地显示,就需要取舍到底是显示数据的值还是显示数据转换为字符后的样子。

如果您关心的是二个字符串合并,那么您最好在合并时,检查每个被合并的字符串是否可以
合法显示,比如,如果某个串的结束位置包含 #0 ,就要对这个 Char 进行过滤。能够合法
显示的字符的值,就是 ASCII 表上的定义,比如 < 32 和 > 127 的值,通常都是需要转义
显示或过滤的。

如果您关心的是完整的数据,那么最好在把各个连接的数据在连接时,统统转换为他们的数
值表示。这样连接后取出来显示时,虽然同样要做过滤处理,但可以直接从过滤后的数据的
值中,转换出字符显示的样子。或者转换为数据的字符表达(这就连过滤都不需要了,因为
所有数据都将被表达成该数据的数值的字符显示)。
 
谢谢。我在研究下
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
825
DelphiTeacher的专栏
D
D
回复
0
查看
831
DelphiTeacher的专栏
D
D
回复
0
查看
664
DelphiTeacher的专栏
D
后退
顶部