Delphi除了能方便的创建文本格式的文件外,其它的格式怎么做? (50分)

  • 主题发起人 主题发起人 ili
  • 开始时间 开始时间
I

ili

Unregistered / Unconfirmed
GUEST, unregistred user!
我的目的是使创建的文件用Notepad打开的时候是乱码
 
转成ASII码,也可啊.
在不行加密了.
 
我现在就是用加密,可总觉得不舒服:(
不知那些如word等的格式文件是怎么弄出来的??
 
用richEdit这可创建Word格式.也可读!

用save和load就可以读和写Word的rtf文件了。
 
可我现在只是要文件不是文本编辑器
好像f:file这样可以弄出乱码
 
其实这种文件一般使用流创建的
使用Tfilestream
写入Integer值1或者其他的值就看不出来了。
比如格式化一段字
先写入字体名、然后是字体大小、再是文字、结束符,
使用不是文本字符,就会显示不出来了。
 
用blockwrite试试
 
To:Pan Ying,
可以给个简单的例子么?多谢了
 
我顶!大哥请帮忙……
 
简单,你在写入之前,吧每个字节变换一下不久行了?提这样的问题,难怪没有人回答了,
任何语言都可以生成合读取任何格式的文件,只是在于你自己的能力而已。
 
ASCII变换??这个谁不会?!我是想要Pan Ying说的那种看看
别这么有恃无恐好不好?!
 
我不是有恃无恐,而是看不惯你用这样的题目~~~~
Delphi除了能创建文本格式的文件外,还有其它的么?
听着就别扭~~~~~
 
哦?有什么不妥么?因为我不知道还有什么呀?是不是题目有歧义??你理解成了我在小看Delphi?
我的天~~~~~暂不讨论语文~~~~
那你帮忙给个例子好么?
 
实际上你的问题涉及到编码,看看下面的2种方法,用C写的:

1. Uuencode
; ; Uuencode 是将二进制文件以文本文件方式进行编码表示、
以利于基于文本传输环境中进行二进制文件的传输/交换的编
码方法之一, 在邮件系统/二进制新闻组中使用频率比较高,
经常用于 Attach 二进制文件。
; ; 这种编码的特征是:每一行开头用“M”标志。下面是我
做的一个测试用的文件mogao.txt,编码为Uuencode:
begin 644 mogao.txt
M"0D)("`@(*&VPM+"Z/OCMZBT//BKH;<-"@G7]]7?.FUO9V%OHZRPU]3&N/:Z
MU]6^HZAT96QN970Z+R/R,#(N,3$R+C(P+C$S,CHR,Z.IL/G4L:&C#0H)("`@
M("`@Q*JXW/CMO/ZYI-?WRM*CNFAT='`Z+R]M;V=A;RYB96YT:75N+FYE=`T*
M"0D)16UA:6QT;SIM;V=A;T`S-S$N;F5T#0H)("`@*BHJ*BHJ*BHJ*BHJ*BHJ
M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ("`@("`@("`@("`@("`@
M#0H)("`@*B"S_<'+O,?2Y,JRP[2VO+*[M/C7WZ.LL_W!R]?CO*/*LL.TMKRR
MN/'TS/(J#0H)("`@*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ
,*BHJ*BHJ*BHJ*BHJ
`
end
; ; 你可以把它单独存成一个文件:mogao.uue,然后用Winzip
打开,解压即得mogao.txt。
; ; Uuencode的算法很简单,编码时它将3个字符顺序放入一个
;24 位的缓冲区,缺字符的地方补零,然后将缓冲区截断成为
4 个部分,高位在先,每个部分 6 位,用下面的64个字符重新
表示:
"`!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[/]^_"
在文件的开头有“begin xxx 被编码的文件名”,在文件的结尾
有“end”,用来标志Uue文件的开始和结束。编码时,每次读取
源文件的45个字符,不足45个的用“NULL”补足为3的整数倍(
如:23补为24),然后输入目标文件一个ASCII为:“32+实际
读取的字符数”的字符作为每一行的开始。读取的字符编码后
输入目标文件,再输入一个“换行符”。如果源文件被编码完
了,那么输入“`(ASCII为96)”和一个“换行符”表示编码
结束。
; ; 解码时它将4个字符分别转换为4个6位字符后,截取有用的
后六位放入一个 24 位的缓冲区,即得3个二进制代码。
; ; 下面我给出Uuencode编码和解码的C语言描述:
/*Uuencode编码*/
void Uue(unsigned char chasc[3],unsigned char chuue[4])
/*
chasc:未编码的二进制代码
chuue:编码过的Uue代码
*/
{int i,k=2;
;unsigned char t=NULL;
;for(i=0;i<3;i++)
;{*(chuue+i)=*(chasc+i)>>k;
; *(chuue+i)|=t;
; if(*(chuue+i)==NULL) *(chuue+i)+=96;
; else *(chuue+i)+=32;
; t=*(chasc+i)<<(8-k);
; t>>=2;
; k+=2;
;}
;*(chuue+3)=*(chasc+2)&63;
;if(*(chuue+3)==NULL) *(chuue+3)+=96;
;else *(chuue+3)+=32;
}
/*Uuencode解码*/
void unUue(unsigned char chuue[4],unsigned char chasc[3])
/*
chuue:未解码的Uue代码
chasc:解码过的二进制代码
*/
{int i,k=2;
;unsigned char t=NULL;
;if(*chuue==96) *chuue=NULL;
;else *chuue-=32;
;for(i=0;i<3;i++)
;{*(chasc+i)=*(chuue+i)<<k;
; k+=2;
; if(*(chuue+i+1)==96) *(chuue+i+1)=NULL;
; else *(chuue+i+1)-=32;
; t=*(chuue+i+1)>>8-k;
; *(chasc+i)|=t;
;}
}

2. Xxencode
; ; 提到Uuencode不可能不提Xxencode, Xxencode的编码算法
和 Uuencode基本相同,但是使用的是不同的字符集。XxEncode
编码使用的字符是:
“+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz”
与 Uuencode 相比,它的特殊字符更少。很多支持 Uuencode
编解码的工具都同时支持 Xxencode。
; ; 这种编码的特征是:每一行开头用“h”标志。下面是
Xxencode的一个例子:
begin 644 mogao.txt
h0EY760+U684qkh90uwjXhuWowwWfcPQB0UbLxxLTCapjNq3jcumkpxH4iwOu
hpxKycuVoNKliNLEu9mwmA16iAH2m9X6k9X2nAXcmAuCdgwbIgO4X1Ec760+U
h60+Ul8esrwXhjDutdBTrmh8XiaVoR5+u9mxhPqRVPmtWNKtoOLJi9atZR+o8
h0EY7FKpVOKloPndhPqRVPo+nBn2iPaJo1Ec760+U8Wce8Wce8Wce8Wce8Wce
h8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce60+U60+U60+U60+U60+U
h1Ec760+U8W0nzQ59jATGtAemkvGqj98vhDXLruCggzr-mxTXj8D8ggCohfmm
hiw5onw6e1Ec760+U8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce
A8Wce8Wce8Wce8Wce
+
end
; ; 你可以把它单独存成一个文件:mogao.xxe,然后用Winzip
打开,解压即得mogao.txt。
; ; Xxencode的编码算法和Uuencode基本相同,实现起来则更
为简单,在此就不详述了。
; ; 下面给出Xxencode编码和解码的C语言描述:
/*Xxencode编码*/
;void Xxe(unsigned char chasc[3],unsigned char chxxe[4])
/*
chasc:未编码的二进制代码
chxxe:编码过的Xxe代码
*/
{int i;
;static char set[]=
; "+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
;chxxe[0]=chasc[0]>>2;
;chxxe[1]=(chasc[0]<<4)&48|(chasc[1]>>4)&15;
;chxxe[2]=(chasc[1]<<2)&60|(chasc[2]>>6)&3;
;chxxe[3]=chasc[2]&63;
;for(i=0;i<4;i++) chxxe=set[chxxe]; ; ; ; ; ; ; ; ; ; ; ; /*查表*/
}
/*需注意的是,Xxencode文件正文部分中每一行的第一个字母是
:从源文件中实际读取的字符数的ASCII值取后六位后用set[]查
表得到的。*/
/*Xxencode解码*/
unsigned char set(unsigned char ch) ; ; ; ; ; ; ; ; ; ; ; ; ; ; /*查表函数*/
{if(ch==43) ch=0;
;else if(ch==45) ch=1;
;else if(ch>=48&&ch<=57) ch-=46;
;else if(ch>=65&&ch<=90) ch-=53;
;else if(ch>=97&&ch<=122) ch-=59;
;return ch;
}
void unXxe(unsigned char chxxe[4],unsigned char chasc[3])
/*
chxxe:未解码的Xxe代码
chasc:解码过的二进制代码
*/
{int k=2 ,i;
;unsigned char t;
;t=NULL;
;*chxxe=set(*chxxe);
;for(i=0;i<3;i++)
;{*(chxxe+i+1)=set(*(chxxe+i+1));
; (chhex+i)=*(chxxe+i)<<k;
; k+=2;
; t=*(chxxe+i+1)>>8-k;
; *(chhex+i)|=t;
;}
}
 
你可以使用记录类型的文件
先声明一个记录类型
在声明一个这个记录类型的文件类型
基本和文本文件的方法一样
 
To smilboy
记录文件出来的文件内容可不是乱码哦
 
当然不是了
问题你怎么打开
打开的时候你还可以记录文件类型打开,这样可以得到你保存的哪个记录变量
如果你用记事本打开当然是乱码了
 
string类型的内容用Notepad打开不会乱码!怎么回事????
 
如果你要string类型的字看出来也是乱码,就一定要编码了。
不然还是看得出来的。
如果觉得麻烦,不如存完以后使用Zlib.pas中压缩函数来压缩文件。
这样就可以保证打开来的是乱码了。
打开前,先解压缩就可以读了。
 
后退
顶部