实现代码:function Cov(Str:String):String; var i,j:Integer; begin Result:=''; j:=0; for i:=1 to Length(Str) do begin Result:=Result+IntToHex(Byte(Str[i]),2); j:=(j+1) mod 8; end; end;procedure TForm1.FormCreate(Sender: TObject); begin Caption := Cov('杯具啊杯具'); end;
不行啊,原来是用delphi2009写的 源码: {*******************************************************} { } { GetLrc } { } { 版权所有 (C) 2009 YulinSoft } { } {*******************************************************}unit untMain;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, XMLDoc, XMLIntf, ImgList,uEncoding;type TfrmMain = class(TForm) Label1: TLabel; edt_arts: TEdit; edt_Song: TEdit; lbl1: TLabel; btn_Search: TButton; ListView1: TListView; Memo1: TMemo; IdHTTP1: TIdHTTP; GroupBox1: TGroupBox; RadioButton1: TRadioButton; RadioButton2: TRadioButton; ImageList1: TImageList; dlgSave1: TSaveDialog; procedure btn_SearchClick(Sender: TObject); procedure ListView1DblClick(Sender: TObject); procedure Memo1DblClick(Sender: TObject); private { Private declarations } function ToQianQianHexString(s: string; encode: TEncoding): string; function CreateQianQianCode(singer, title: string; lrcId: integer): string; function Conv(i: Integer): int64; public { Public declarations } end;var frmMain: TfrmMain; const SearchPath = 'http://ttlrcct.qianqian.com/dll/lyricsvr.dll?sh?Artist=%s&Title=%s&Flags=0'; SearchPath1 = 'http://ttlrccnc.qianqian.com/dll/lyricsvr.dll?sh?Artist=%s&Title=%s&Flags=0'; DownloadPath = 'http://ttlrcct.qianqian.com/dll/lyricsvr.dll?dl?Id=%s&Code=%s'; DownloadPath1 = 'http://ttlrccnc.qianqian.com/dll/lyricsvr.dll?dl?Id=%s&Code=%s'; implementation{$R *.dfm}function TfrmMain.ToQianQianHexString(s: string; encode: TEncoding): string; var TmpStr: string; ByteAy: Tbytes; tmpByte: Byte; begin ByteAy := encode.GetBytes(s); TmpStr := ''; for tmpByte in ByteAy do TmpStr := Format('%s%.2x', [tmpstr, tmpbyte]); Result := TmpStr; end;function TfrmMain.Conv(i: integer): int64; var r: int64; begin r := i mod 4294967296; if (i >= 0) and (r > 2147483648) then r := r - 4294967296; if (i < 0) and (r < 2147483648) then r := r + 4294967296; Result := r; end;function TfrmMain.CreateQianQianCode(singer, title: string; lrcId: integer): string; var qqHexStr: string; MyLen, i, j, t1, t2, t3, t4, t5, c: Integer; t6: Int64; song: array of Integer; begin //GET /dll/lyricsvr.dll?dl?Id=228350&Code=1424073039 HTTP/1.1 qqHexStr := ToQianQianHexString(singer + title, TEncoding.UTF8); MyLen := Length(qqHexStr) div 2; SetLength(song, mylen); for I := 0 to MyLen - 1 do song[i] := StrToInt('$' + copy(qqHexStr, i * 2 + 1, 2)); t2 := 0; t1 := (lrcId and $0000FF00) shr 8; if (lrcId and $00FF0000) = 0 then t3 := $000000FF and (not t1) else t3 := $000000FF and ((lrcId and $00FF0000) shr 16); t3 := t3 or (($000000FF and lrcId) shl 8); t3 := t3 shl 8; t3 := t3 or ($000000FF and t1); t3 := t3 shl 8; if ((lrcId and $FF000000) = 0) then t3 := t3 or ($000000FF and (not lrcId)) else t3 := t3 or ($000000FF and (lrcId shr 24)); j := MyLen - 1; while (j >= 0) do begin c := song[j]; if (c >= $80) then c := c - $100; t1 := (c + t2) and $00000000FFFFFFFF; t2 := (t2 shl (j mod 2 + 4)) and $00000000FFFFFFFF; t2 := (t1 + t2) and $00000000FFFFFFFF; Dec(j); end; j := 0; t1 := 0; while j <= (mylen - 1) do begin c := song[j]; if (c >= 128) then c := c - 256; t4 := (c + t1) and $00000000FFFFFFFF; t1 := (t1 shl (j mod 2 + 3)) and $00000000FFFFFFFF; t1 := (t1 + t4) and $00000000FFFFFFFF; Inc(j); end; t5 := Conv(t2 xor t3); t5 := Conv(t5 + (t1 or lrcId)); t5 := Conv(t5 * (t1 or t3)); t5 := Conv(t5 * (t2 xor lrcId)); t6 := t5; if (t6 > 2147483648) then t5 := t6 - 4294967296; Result := IntToStr(t5); end;procedure TfrmMain.btn_SearchClick(Sender: TObject); var XMLString, Singer, Title, MyUrl: string; XMLDOC: IXMLDocument; XmlNd, TmpNd: IXMLNode; lvitem: TListItem; i: Integer; begin btn_Search.Enabled := False; if RadioButton1.Checked then MyUrl := SearchPath else MyUrl := SearchPath1; Singer := StringReplace(edt_arts.Text, ' ', '', [rfReplaceAll]); Singer := StringReplace(Singer, '''', '', [rfReplaceAll]); Singer := LowerCase(Singer); Title := StringReplace(edt_Song.Text, ' ', '', [rfReplaceAll]); Title := StringReplace(Title, '''', '', [rfReplaceAll]); Title := LowerCase(Title); XMLString := IdHTTP1.Get(Format(MyUrl, [ToQianQianHexString(edt_arts.Text, TEncoding.Unicode), ToQianQianHexString(edt_Song.Text, TEncoding.Unicode)])); XMLDOC := LoadXMLData(XMLString); XmlNd := xmldoc.DocumentElement; ListView1.Clear; lvitem := nil; for I := 0 to XmlNd.ChildNodes.Count - 1 do begin TmpNd := XmlNd.ChildNodes[i]; lvitem := ListView1.Items.Add; lvitem.ImageIndex := 0; lvitem.Caption := TmpNd.Attributes['id']; lvitem.SubItems.Add(TmpNd.Attributes['artist']); lvitem.SubItems.Add(TmpNd.Attributes['title']); end; if XmlNd.ChildNodes.Count = 1 then begin lvitem.Selected := True; ListView1DblClick(Sender); end; XMLDOC := nil; btn_Search.Enabled := true; end;procedure TfrmMain.ListView1DblClick(Sender: TObject); var lvitem: TListItem; TmpUrl, MyUrl: string; begin if RadioButton1.Checked then MyUrl := DownloadPath else MyUrl := DownloadPath1; lvitem := ListView1.Selected; TmpUrl := Format(MyUrl, [lvitem.Caption, CreateQianQianCode(lvitem.SubItems[0], lvitem.SubItems[1], StrToInt(lvitem.Caption))]); Memo1.text := IdHTTP1.Get(tmpurl); end;procedure TfrmMain.Memo1DblClick(Sender: TObject); begin dlgSave1.FileName := Format('%s - %s.lrc', [edt_arts.Text, edt_Song.text]); if not dlgSave1.Execute then Exit; Memo1.Lines.SaveToFile(dlgSave1.FileName, TEncoding.Unicode); end;end.
这个结果就是该段文本的UNICODE编码值
在delphi7下面怎么获得这个结果呢?
这次可以了 function ToUnicode(Ansi: string):string; var s:string; i:integer; j,k:string[2]; a:array [1..1000] of char; begin s:=''; StringToWideChar(Ansi,@(a[1]),500); i:=1; while ((a[i]<>#0) or (a[i+1]<>#0)) do begin j:=IntToHex(Integer(a[i]),2); k:=IntToHex(Integer(a[i+1]),2); s:=s+j+k; i:=i+2; end; Result:=s; end;procedure TForm1.FormCreate(Sender: TObject); begin Caption := ToUnicode('大海啊故乡'); // 2759776D4A554565614E end;
var
i,j:Integer;
begin
Result:='';
j:=0;
for i:=1 to Length(Str) do
begin
Result:=Result+IntToHex(Byte(Str[i]),2);
j:=(j+1) mod 8;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Caption := Cov('杯具啊杯具');
end;
不行啊,原来是用delphi2009写的
源码:
{*******************************************************}
{ }
{ GetLrc }
{ }
{ 版权所有 (C) 2009 YulinSoft }
{ }
{*******************************************************}unit untMain;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdHTTP, XMLDoc, XMLIntf, ImgList,uEncoding;type
TfrmMain = class(TForm)
Label1: TLabel;
edt_arts: TEdit;
edt_Song: TEdit;
lbl1: TLabel;
btn_Search: TButton;
ListView1: TListView;
Memo1: TMemo;
IdHTTP1: TIdHTTP;
GroupBox1: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
ImageList1: TImageList;
dlgSave1: TSaveDialog;
procedure btn_SearchClick(Sender: TObject);
procedure ListView1DblClick(Sender: TObject);
procedure Memo1DblClick(Sender: TObject);
private
{ Private declarations }
function ToQianQianHexString(s: string; encode: TEncoding): string;
function CreateQianQianCode(singer, title: string; lrcId: integer): string;
function Conv(i: Integer): int64;
public
{ Public declarations }
end;var
frmMain: TfrmMain;
const
SearchPath = 'http://ttlrcct.qianqian.com/dll/lyricsvr.dll?sh?Artist=%s&Title=%s&Flags=0';
SearchPath1 = 'http://ttlrccnc.qianqian.com/dll/lyricsvr.dll?sh?Artist=%s&Title=%s&Flags=0';
DownloadPath = 'http://ttlrcct.qianqian.com/dll/lyricsvr.dll?dl?Id=%s&Code=%s';
DownloadPath1 = 'http://ttlrccnc.qianqian.com/dll/lyricsvr.dll?dl?Id=%s&Code=%s';
implementation{$R *.dfm}function TfrmMain.ToQianQianHexString(s: string; encode: TEncoding): string;
var TmpStr: string;
ByteAy: Tbytes;
tmpByte: Byte;
begin
ByteAy := encode.GetBytes(s);
TmpStr := '';
for tmpByte in ByteAy do
TmpStr := Format('%s%.2x', [tmpstr, tmpbyte]);
Result := TmpStr;
end;function TfrmMain.Conv(i: integer): int64;
var
r: int64;
begin
r := i mod 4294967296;
if (i >= 0) and (r > 2147483648) then
r := r - 4294967296;
if (i < 0) and (r < 2147483648) then
r := r + 4294967296;
Result := r;
end;function TfrmMain.CreateQianQianCode(singer, title: string;
lrcId: integer): string;
var
qqHexStr: string;
MyLen, i, j, t1, t2, t3, t4, t5, c: Integer;
t6: Int64;
song: array of Integer;
begin
//GET /dll/lyricsvr.dll?dl?Id=228350&Code=1424073039 HTTP/1.1
qqHexStr := ToQianQianHexString(singer + title, TEncoding.UTF8);
MyLen := Length(qqHexStr) div 2;
SetLength(song, mylen);
for I := 0 to MyLen - 1 do
song[i] := StrToInt('$' + copy(qqHexStr, i * 2 + 1, 2));
t2 := 0;
t1 := (lrcId and $0000FF00) shr 8;
if (lrcId and $00FF0000) = 0 then
t3 := $000000FF and (not t1)
else
t3 := $000000FF and ((lrcId and $00FF0000) shr 16);
t3 := t3 or (($000000FF and lrcId) shl 8);
t3 := t3 shl 8;
t3 := t3 or ($000000FF and t1);
t3 := t3 shl 8;
if ((lrcId and $FF000000) = 0) then
t3 := t3 or ($000000FF and (not lrcId))
else
t3 := t3 or ($000000FF and (lrcId shr 24));
j := MyLen - 1;
while (j >= 0) do
begin
c := song[j];
if (c >= $80) then
c := c - $100;
t1 := (c + t2) and $00000000FFFFFFFF;
t2 := (t2 shl (j mod 2 + 4)) and $00000000FFFFFFFF;
t2 := (t1 + t2) and $00000000FFFFFFFF;
Dec(j);
end;
j := 0;
t1 := 0;
while j <= (mylen - 1) do
begin
c := song[j];
if (c >= 128) then
c := c - 256;
t4 := (c + t1) and $00000000FFFFFFFF;
t1 := (t1 shl (j mod 2 + 3)) and $00000000FFFFFFFF;
t1 := (t1 + t4) and $00000000FFFFFFFF;
Inc(j);
end;
t5 := Conv(t2 xor t3);
t5 := Conv(t5 + (t1 or lrcId));
t5 := Conv(t5 * (t1 or t3));
t5 := Conv(t5 * (t2 xor lrcId));
t6 := t5;
if (t6 > 2147483648) then
t5 := t6 - 4294967296;
Result := IntToStr(t5);
end;procedure TfrmMain.btn_SearchClick(Sender: TObject);
var
XMLString, Singer, Title, MyUrl: string;
XMLDOC: IXMLDocument;
XmlNd, TmpNd: IXMLNode;
lvitem: TListItem;
i: Integer;
begin
btn_Search.Enabled := False;
if RadioButton1.Checked then
MyUrl := SearchPath
else
MyUrl := SearchPath1;
Singer := StringReplace(edt_arts.Text, ' ', '', [rfReplaceAll]);
Singer := StringReplace(Singer, '''', '', [rfReplaceAll]);
Singer := LowerCase(Singer);
Title := StringReplace(edt_Song.Text, ' ', '', [rfReplaceAll]);
Title := StringReplace(Title, '''', '', [rfReplaceAll]);
Title := LowerCase(Title);
XMLString := IdHTTP1.Get(Format(MyUrl, [ToQianQianHexString(edt_arts.Text, TEncoding.Unicode), ToQianQianHexString(edt_Song.Text, TEncoding.Unicode)]));
XMLDOC := LoadXMLData(XMLString);
XmlNd := xmldoc.DocumentElement;
ListView1.Clear;
lvitem := nil;
for I := 0 to XmlNd.ChildNodes.Count - 1 do
begin
TmpNd := XmlNd.ChildNodes[i];
lvitem := ListView1.Items.Add;
lvitem.ImageIndex := 0;
lvitem.Caption := TmpNd.Attributes['id'];
lvitem.SubItems.Add(TmpNd.Attributes['artist']);
lvitem.SubItems.Add(TmpNd.Attributes['title']);
end;
if XmlNd.ChildNodes.Count = 1 then
begin
lvitem.Selected := True;
ListView1DblClick(Sender);
end;
XMLDOC := nil;
btn_Search.Enabled := true;
end;procedure TfrmMain.ListView1DblClick(Sender: TObject);
var
lvitem: TListItem;
TmpUrl, MyUrl: string;
begin
if RadioButton1.Checked then
MyUrl := DownloadPath
else
MyUrl := DownloadPath1;
lvitem := ListView1.Selected;
TmpUrl := Format(MyUrl, [lvitem.Caption, CreateQianQianCode(lvitem.SubItems[0], lvitem.SubItems[1], StrToInt(lvitem.Caption))]);
Memo1.text := IdHTTP1.Get(tmpurl);
end;procedure TfrmMain.Memo1DblClick(Sender: TObject);
begin
dlgSave1.FileName := Format('%s - %s.lrc', [edt_arts.Text, edt_Song.text]);
if not dlgSave1.Execute then Exit;
Memo1.Lines.SaveToFile(dlgSave1.FileName, TEncoding.Unicode);
end;end.
在delphi7下面怎么获得这个结果呢?
function ToUnicode(Ansi: string):string;
var
s:string;
i:integer;
j,k:string[2];
a:array [1..1000] of char;
begin
s:='';
StringToWideChar(Ansi,@(a[1]),500);
i:=1;
while ((a[i]<>#0) or (a[i+1]<>#0)) do
begin
j:=IntToHex(Integer(a[i]),2);
k:=IntToHex(Integer(a[i+1]),2);
s:=s+j+k;
i:=i+2;
end;
Result:=s;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Caption := ToUnicode('大海啊故乡'); // 2759776D4A554565614E
end;