首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

,新手学delphi,多谢大家

2012-03-11 
在线等,新手学delphi,谢谢大家我现在要写一个解密的小算法,加密处理方法如下:A.从左向右,将每位数值转化成

在线等,新手学delphi,谢谢大家
我现在要写一个解密的小算法,加密处理方法如下:
A.从左向右,将每位数值转化成文本,然后获得其ASCII码,最后加上该数值对应的位数。(从左向后数位数,最左边为数值为1)
B.从左向右,将(A)步得到的计算值串成字符串。值与值之间加1个空格区分。字符串首末不加空格。
C.将(B)步得到的字符串存入到文本文件中,例如c:\zl.txt。
解密运算方法:
将加密过程进行反向运算即可。下面举例说明。
首先在c:\zl.txt读取字符串,
例如:你获得原始文本为“50 52 53 50 58”。
对应原码: 50 52 53 50 58
数值位数: 1 2 3 4 5 
运算方法:取每位对应的密文,减去其位数,即可得到该位真实数值的ASCII码,将ASCII码转化为对应的字符。将得到的字符从左向右依次串成字符串,转化成浮点数值类型即可。此浮点数就是你需要的真实的重量值。

比如:第一位数值对应的密文为 50,计算ASCII码:50-1=49,转化成字符为 1;
  第二位数值对应的密文为 52,计算ASCII码:52-2=50,转化成字符为 2;
  第三位数值对应的密文为 53,计算ASCII码:53-3=50,转化成字符为 2;
  第四位数值对应的密文为 50,计算ASCII码:50-4=46,转化成字符为小数点 .;
  第五位数值对应的密文为 58,计算ASCII码:58-5=53,转化成字符为 5;

由此可得正确重量数值为:122.5吨。
下面是对应ascII码:0:48,1:49,2:50.3:51,4:52,5:53,6:54,7:55,8:56,9:57,.:46。
最高只能给100分,各位别嫌少。刚刚接触delphi,下面是我的代码,也不知道算法对不对,编译不出错但运行出错。希望各位高手指正,并给出正确代码。procedure TForm1.Button1Click(Sender: TObject);
var
  sTemp:TStringList;
  i,j,x,y,z:Integer;
  asc:Integer ;
  ascd,sz:string;
begin
  sTemp:=TStringList.Create();
  sTemp.clear;
  sTemp.LoadFromFile('c:\mzl.txt');
  x:=Length('sTemp');
  y:=(x+1)div 3;
  for i:=1 to y do
  begin
  z:=i*2-1;
  while z<x do
  begin
  sz:='';
  asc:=strtoint(Copy('sTemp',z,2))-i;
  if asc=46 then
  ascd:='.'
  else
  ascd:=inttostr(asc-48);
  end;
  sz:=sz+ascd;
  Edit1.Text:='sz'
  end;
end;
end.

[解决办法]
你的代码假设了密文均为两位数字
1、取密文数值个数(y:=(x+1)div 3)
2、解析密文数值(asc:=strtoint(Copy('sTemp',z,2))-i)
当然从这个题目本身来看没有问题的
数字和小数点字符按此转换后均为两位

实际上分解密文中数值时大可以直接利用TStringList类分解,这样代码会更简洁,也更灵活
如果一定要自己分解,建议把分解算法独立为一个过程/函数
这样整体上表达更清楚,可读性要高一些

还有最后面一句
Edit1.Text:='sz'
不太明白,是否意思是Edit1.Text:=sz,用于显示最后结果
同时也应该放到循环外面?
[解决办法]
亮剑说得有理,楼主的代码风格要注意,看着非常费劲、
[解决办法]

Delphi(Pascal) code
function jiemi(srcStr:string):string;var  sTemp:TStringList;  i,asc:Integer;begin  result:='';  sTemp:=TStringList.Create();  sTemp.clear;  stemp.Delimiter:=' ';//分割字符  stemp.DelimitedText:=srcStr;  i:=0;  while i < stemp.Count do  begin      asc:=strtoint(stemp[i])-i + 1 ;      result:=result + chr(asc);      i:=i+1;   end;  stemp.Free;end;
[解决办法]
帖了代码忘记写话了,上面这个函数你传入密文,返回的是明文

热点排行