TXT文件是怎么判断结尾的 在线等 立刻结贴 (150分)

  • 主题发起人 主题发起人 天下第二
  • 开始时间 开始时间

天下第二

Unregistered / Unconfirmed
GUEST, unregistred user!
TXT文件加密遇见问题
我主要使用的是逐行 XOR 加密的方法,但是还原的时候,往往只能还原前面几行。我自己
判断原因可能是我加密产生了 换行符(#13) 和文件结尾符。我想知道的很简单,文件结尾符到底是什么????
 
#10 就是了!
 
我马上测试一下就给分
 
以二进制方式访问文本文件,用Eof()可以正确判断是否文件尾
 
用 Byte 来,可靠着呢
 
不对 我用WINHEX打开普通的 中文TXT 文件 发现里面有很多 #10 (0A) 我的加密代码是这样的
Function addPass(const str : String) : String ;
const
Lock_Key = 'ILOVEYOU';
Var
longkey : String ;
ChunkSize : integer ;
temp : Char ;
begin
longkey := ''
// 初始化加长加密键
ChunkSize := length(Str);
result := str ;
for i := 0 to (ChunkSize div length(Lock_Key)) do
longkey := longkey + Lock_Key;
// 开始加密
for i := 1 to ChunkSize do
begin
temp := result ;
IF Temp <> Chr(0) then // 空白位不加密 防止被解
temp := chr((ord(Temp) XOR ord(longkey)))
// XOR algorithm
if (temp <> #13) AND (Temp <> #10) then //防止产生文件结尾的符号
result := temp ;
end;
end ;
为什么还是只能读出被加密文件的前几行呢 我是这样读的
temp_list := TStringlist.Create ;
temp_list.LoadFromFile(dlgOpen1.FileName);

 
TXT文件以#13#10 0D 0A 结尾,但必须为连贯。
你的 Function 中因该判断 result=#13 and result[i+1]=#10
 
#10是换行
#1A是文件结束符吧?(我记不清楚了)
 
奇怪了 改过后 好象加密是没有错误了 但是 temp_list.LoadFromFile(dlgOpen1.FileName)
读出来的行 远远少于 我用 “记事本”直接打开文件的行
WHY ?
 
to dgsj,
我记得早期 DOS 文件,才有这样的结构吧!

**********************
找到你的问题了!
如果文件内容有 #0 会被误判。
因此在加密后不得为#0
 
好像是 Delphi LoadfromFile 出的问题。
如果档案内容为
ABCDEF#0123
使用 LoadfromFile 只能读取到 ABCDEF
 
真的是这样 感谢 wameng 马上给分
 
很简单的呀,如果想保存为文本文件,加密后再base64一下就可以了
 
经过查证,确实为 TStrings 问题。
因为在
procedure TStrings.LoadFromStream(Stream: TStream);
var
Size: Integer;
S: string;
begin
BeginUpdate;
try
Size := Stream.Size - Stream.Position;
SetString(S, nil, Size);
Stream.Read(Pointer(S)^, Size);
SetTextStr(S)
<---------- 该项函数出了问题!
finally
EndUpdate;
end;
end;

建议加密后的档案使用
TFileStream 读取后-->解密-->在写入到 Tstrings
 
Txt文件在windows下没有结束符的
 
没必要知道文件结尾,将文件读入流,再对流进行换算就可以了
 
S: string;
s自动把#0后面的数据抛弃了。
 
后退
顶部