难道 delphi 中有 类似VB的 Split( )、Chr( ) 函数 ?VB代码 GetNumber("&H" & Cipher(i)) 会把 Cipher(i) 中的字符串转换成对应的 Long 整数,再调用 GetNumber( ) 函数。
如果 delphi 中没有把“数值字符串”转换成相应数据的函数,你自己写一个也很容易吧!
如果 delphi 中没有把“数值字符串”转换成相应数据的函数,你自己写一个也很容易吧!
解决方案 »
- 著作权怎么申请?
- dataReport设定DataSource的问题
- 提交FAQ者必看——FAQ审核和提交标准(恢复)
- 如何在VB中将一个Byte转换成两个Byte,用个函数实现给出代码!100分求助.
- 【新年快乐 VB梦天空 欢迎各网站链接交流】
- 岳父大人勒令我为他的厂子开发一套管理系统,如果失败程序员将遭到鄙视。苦啊:(向大家咨询求助
- VB调用dll的堆栈溢出问题
- 用VB解决实际问题,VB爱好者请进
- 关于IIS应用程序的两个问题
- mysql的表字段名显示中文,但是vb里datagrid的字段名显示乱码,怎么办?
- 一个sq语句要同时调用两个库,在sql server可以运行,在vb中怎么写啊
- 求助如何用正则表达式获取字符串中两区间内容
Plain = Plain & GetNumber("&H" & Cipher(i)) 这句是什么意思呢? 从0开始循环, UBound(Cipher) //返回计算long型的 数? 不行,基础太差
但我说C++的,你应该是明白的吧,你参考一下:VB6.0 C++ 10进制数
&HB2 0xb2 178
&HB209 (short)0xb209 -19959
&HB209& 0xb209L 45577
(↑ 这儿后面的&表示Long类型)
比如:
hex$(100) = 64
hex$(200) = C8
这儿的100、200是10进制的数,64是字符串的 "64", C8是字符串的 "C8"。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}function HexStrToStr(const S:string):string;
var
t:Integer;
ts:string;
M,Code:Integer;
begin
t:=1;
Result:='';
while t<=Length(S) do
begin //xlh 2006.10.21
while (t<=Length(S)) and (not (S[t] in ['0'..'9','A'..'F','a'..'f'])) do
inc(t);
if (t+1>Length(S))or(not (S[t+1] in ['0'..'9','A'..'F','a'..'f'])) then
ts:='$'+S[t]
else
ts:='$'+S[t]+S[t+1];
Val(ts,M,Code);
if Code=0 then
Result:=Result+Chr(M);
inc(t,2);
end;
end;
// 这个递归函数有点看不懂,if 和 else里都做了递归,这不是没有递归出口的死循环了么
function GetNumber(num: Integer): String;
begin
if num < 256 then
Result := chr(Num Xor $B2) //GetNumber(Byte(num xor $B2))
else
result := HexStrToStr(intToHex(num xor $B209,4));
//Result := IntToStr(Num Xor $B209 ); //GetNumber(Byte(num xor $B209))
end;
procedure TForm1.Button1Click(Sender: TObject);
var
cipher: TStringList;
plain: AnsiString;
i: Integer;
desStr: AnsiString;
begin
desStr :='0BEA@64D4@78D9@08AA@64E0@75F1@76C6@06EC@70BE@80@82@08CC@83@04B9@64A7@60B2@87@82@81@05B6';
cipher := TStringList.Create;
ExtractStrings(['@'], [], PAnsiChar(desStr), cipher);
try
for i := 0 to cipher.Count - 1 do
begin
plain := plain + GetNumber(StrToInt('$' + cipher[i]));
end;
memo1.lines.add(plain);
finally
cipher.Free;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
showMessage((intTOHex(47587,4)));
end;end.
Private Function GetNumber(ByVal Num As Long) As String
更贴切的命名,应该是:
Private Function GetDecChar(ByVal Num As Long) As String
它的作用是,按一个“加密的编码”,返回解密后对应的字符(可能是西文字符,也可能是汉字)。按原来的“加密算法”,
标准的ASCII字符码 在加密后,其值的范围是128~255(因为只有1字节)。
加密后的值如果>256的,肯定就是汉字。
(注意这儿我的语句描述,有“内涵”的 ,等下再给你说这个)再看你的 Delphi代码:
function GetNumber(num: Integer): String;
begin
if num < 256 then
Result := chr(Num Xor $B2) //GetNumber(Byte(num xor $B2))
else
result := HexStrToStr(intToHex(num xor $B209,4));
//Result := IntToStr(Num Xor $B209 ); //GetNumber(Byte(num xor $B209))
end;if num < 256 then Result := chr(Num Xor $B2)
那对汉字的“解密”,怎么变成了:result := HexStrToStr(intToHex(num xor $B209,4)); 呢?
① Result 大小写不一致, Delphi应该是要区分大小写的吧?
② 怎么不用 Result := chr(num xor $B209); 难道它不能支持双字节的字符编码?
(按楼主前一次那个贴子的“实例”来看,确实应该是这样的)
我就认为: 它的这个加密算法就存在一种严重的缺陷!再提一下我在 11F 的“内涵描述”吧,前一句“标准的ASCII字符码 在加密后,其值的范围是128~255”。
这个说法肯定没错,标准ASCII字符码的范围是0~127(或说是1~127吧,虽然不是全部是“可显示字符”),
它们 xor &HB2 的结果,最高位由0变成1了,自然就是 128~255的范围了。
但是,我为什么没说“汉字加密后的编码大于等于256”呢?
其实,问题就在于,它的这个加密算法,有一些汉字经“加密→解密”后,由汉字变成了“ASCII字符”!举个例子吧: “拼搏”这个詞,汉字的 GB2312码是: &HC6B4 &HB2AB
加密后: &H74BD &HA2
注意第2个字的加密后密码值:&HA2 = 162 ,这个162就在128~255之间了,解密还能把它还原出汉字吗?显示,已经不能正确解密了…………