请教两个C函数改写为delphi

likeyrain 2010-07-06 05:12:56
大家好:
有没有人能帮忙改写一下啊?

// 把字符串转换为16进制字符串
// 如:a变成61(即10进制的97);abc变成616263
function stringToHex(s) {
var r='';
var hexes=new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
for(var i=0;i<(s.length);i++){r+=hexes[s.charCodeAt(i)>>4]+hexes[s.charCodeAt(i)&0xf];}
return r;
}
// 16进制字符串转换为字符串
// 如:61(即10进制的97)变成a;616263变成abc
function HexTostring(s){
var r='';
for(var i=0;i<s.length;i+=2){
var sxx=parseInt(s.substring(i,i+2),16);
r+=String.fromCharCode(sxx);}
return r;
}
...全文
94 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
likeyrain 2010-07-07
  • 打赏
  • 举报
回复
另外这个帖子没人回,帮顶给分,谢谢
http://topic.csdn.net/u/20100421/13/32304985-2a52-4b85-ab9f-a9ba24abb7ba.html
likeyrain 2010-07-07
  • 打赏
  • 举报
回复
僵哥函数结果跟一面两位兄弟是一致的,看来的我某些地方搞错啦,谢谢大家,结帖.
likeyrain 2010-07-06
  • 打赏
  • 举报
回复
哦,好象是JS
僵哥 2010-07-06
  • 打赏
  • 举报
回复
// 把字符串转换为16进制字符串
// 如:a变成61(即10进制的97);abc变成616263
function stringToHex(const s: AnsiString): AnsiString;
const
hexes: array [0..$f] of AnsiChar = ('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
var
I, iLen: Integer;
begin
iLen := Length(s);
SetLength(Result, iLen * 2);
for I := 0 to iLen - 1 do begin
Result[I * 2 + 1] := hexes[Byte(s[i+1]) shr 4];
Result[I * 2 + 2] := hexes[Byte(s[i+1]) and $f];
end;
end;
// 16进制字符串转换为字符串
// 如:61(即10进制的97)变成a;616263变成abc
function HexTostring(const s: AnsiString): AnsiString;
var
I, iLen: Integer;
C0,C1: AnsiChar;
B0,B1: Word;
begin
iLen := Length(s);
SetLength(Result, iLen div 2);
I := 0;
while iLen > I do begin
C0 := S[I+1];
C1 := S[I+2];
case C0 of
'1'..'9': B0 := Byte(C0) - 48;
'a'..'f': B0 := Byte(C0) - 97 + 10;
'A'..'F': B0 := Byte(C0) - 65 + 10;
else
B0 := 0;
end;
case C1 of
'1'..'9': B1 := Byte(C1) - 48;
'a'..'f': B1 := Byte(C1) - 97 + 10;
'A'..'F': B1 := Byte(C1) - 65 + 10;
else
B1 := 0;
end;
Result[I div 2 + 1] := AnsiChar(B0 shl 4 or B1);
Inc(I, 2);
end;
end;

测试代码:
var
s1, s2, S3: AnsiString;
begin
s1 := 'abc123';
s2 := stringToHex(s1);
S3 := HexTostring(S2);
ShowMessage(Format('S1="%s"'#13#10'S2="%s"'#13#10'S3="%s"',[s1,s2,S3]));
end;
  • 打赏
  • 举报
回复
这不是c代码吧,是JavaScript。
likeyrain 2010-07-06
  • 打赏
  • 举报
回复
两个函数加密后再解密,是能正确还原,abc也是变成616263,但加密后跟用上面函数的不一样
是这一句注释误导大家,上面函数好象并没有将abc转为616263,不好意思!!
// 如:a变成61(即10进制的97);abc变成616263
SuperTitan004 2010-07-06
  • 打赏
  • 举报
回复
你说俺怎么能知道他是怎么加密的?
俺只是看要求
俺的第一个函数负责把'abc'变成'616263'
俺的第二个函数负责把'616263'变成'abc'
likeyrain 2010-07-06
  • 打赏
  • 举报
回复
上面两个兄弟加密后结果是一至的,但跟原因的加密出来的不一至
SQLDebug_Fan 2010-07-06
  • 打赏
  • 举报
回复
哪你要解密了。
likeyrain 2010-07-06
  • 打赏
  • 举报
回复
加密后结果不一样呢
SuperTitan004 2010-07-06
  • 打赏
  • 举报
回复
自己写的两个,测试OK

function stringToHex(s:string):string;
var
i:integer;
begin
result:='';
for i:=1 to length(s) do
result:=result+inttohex(ord(s[i]),2);
end;

function HexTostring(s:string):string;
var
i:integer;
begin
result:='';
for i:=1 to length(s) div 2 do
result:=result+chr(strtoint('$'+copy(s,(i-1)*2+1,2)));
end;
SQLDebug_Fan 2010-07-06
  • 打赏
  • 举报
回复
给你两个函数:

function DataToHex(Data: PChar; Len: integer): string;
//把指定的二进制数据转换成十六进制表示的字符串
begin
SetLength(Result, Len shl 1);
BinToHex(Data, PChar(Result), Len);
end;

function HexToData(const HexStr: string): string;
//转换十六进制字符串数据为字符串
begin
SetLength(Result, Length(HexStr) shr 1);
Classes.HexToBin(PChar(HexStr), PChar(Result), Length(Result));
end;

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧