您的位置:首页 > 编程语言 > Delphi

delphi 对应 c# 的一些函数及类型的转换方法【原】

2011-08-17 20:36 691 查看
例一

实现目的:将字符串中每一个字符转成二进制(比如 'Data' 中的 D 转成 00100010 ,整个就是 00100010100001100010111010000110)

处理逻辑:string result = StrToByte("Data"); result结果是00100010100001100010111010000110

  1、实际上 D 转成十进制是68,68再转成二进制是 1000100 ,c#中我用 Convert.ToString(b, 2) 转了之后只有7位,不知道为什么只有7位,所以前面补 0 就变成了 01000100

  2、将补够8位的二进制进行倒序,就得到结果:00100010

  3、delphi 代码代码如下:

//StrToByte函数
function StrToByte(Str : string):string;
var
i : integer;
temp : string;
begin
for i := 1 to Length(Str) do
begin
temp := temp + CharToByte(byte(Str[i]));
end;
Result := Temp;
end;

//CharToByte函数
function CharToByte(S : integer):string;
var
temp : string;
begin
while true do
begin
if S mod 2 = 0 then
begin
S := S div 2;
temp := temp + '0';
if S = 1 then
begin
temp := temp + '1';
break;
end;
end
else begin
S := S div 2;
temp := temp + '1';
if S = 1 then
begin
temp := temp + '1';
break;
end;
end;
end;
Temp := LeftStr((Temp + '00000000'),8);
Result := Temp;
end;


------------------------------

在c#里面是这样写的:

string StrToByte(string Str)
{
string result = string.Empty;

byte[] bs = Encoding.UTF8.GetBytes(Str);
foreach (byte b in bs)
{
//将b转成二进制
string tmp = Convert.ToString(b, 2);
//不够8位左边补0
tmp = tmp.PadLeft(8, '0');
char[] cs = tmp.ToCharArray();
//将所有元素进行倒序
Array.Reverse(cs);
tmp = new string(cs);
result += tmp;
}
return result;
}


例二

实现目的:将经算法加密过的二进制转成字符串,比如将1001101111010011 转成 sa

处理逻辑:string result=DecryptString("1001101111010011"); result结果是sa

//DecryptString函数
function DecryptString(Str: String): String;
var
i : integer;
temp : string;
begin
for i := 1 to length(Str) do
begin
if i mod 2 = 0 then
begin
if Str[i] = '1' then
Str[i] := '0'
else
Str[i] := '1';
end;
end;

for i := 1 to length(Str) do
begin
if i mod 8 = 0 then
begin
temp := temp + ByteToChar(copy(Str,i-7,8));
end;
end;
Result := temp;
end;

//ByteToChar函数
function ByteToChar(ByteStr : string):String;
var
i : integer;
IntVal : extended;// extended == c#:double
begin
IntVal := 0;
for i := 1 to length(ByteStr) do
begin
IntVal := IntVal + powerEx(2,i-1) * strtoint(ByteStr[i]);
end;
Result := Chr(strtoint(FloatToStr(IntVal)));
end;

//PowerEx函数
function PowerEx(x, y : extended) : extended;
begin
result := exp(y*ln(x));
end;


---------------------------------------

c#中代码是这样写的:

string DecryptString(string Str)
{
string result = string.Empty;
char[] cs = Str.ToCharArray();
for (int i = 0; i < cs.Length; i++)
{
if ((i + 1) % 2 == 0)
{
if (cs[i] == '1')
cs[i] = '0';
else
cs[i] = '1';
}
}
Str = new string(cs);
for (int j = 0; j < Str.Length; j++)
{
if ((j + 1) % 8 == 0)
{
result += ByteToChar(Str.Substring(j - 7, 8));
}
}
return result;
}
string ByteToChar(string ByteStr)
{
double IntVal = 0;
string result = string.Empty;

for (int i = 0; i < ByteStr.Length; i++)
{
IntVal += PowerEx(2, i) * Convert.ToInt32(ByteStr[i].ToString());
}
return Convert.ToChar(Convert.ToInt32(IntVal.ToString())).ToString();
}
double PowerEx(double x, double y)
{
return Math.Exp(y * Math.Log(x, Math.E));
}


几个关键的地方:

1、delphi的string的索引是从1开始的,所以在%运算的时候 i或j 都加了1;

2、c#中string的某一个char无法直接赋值,如 DecryptString函数中的Str[i]='1',这样会报错,说无法对其赋值,所以需要转成char数组,再对数组元素进行赋值,最后再Str=new string(cs)赋回给Str;

3、delphi中的ln(x)对应c#中的Math.Log(x,Math.E),exp()对应Math.Exp()

4、delphi中的strtoint(ByteStr[i]) 开始我以为c#是Convert.ToInt32(ByteStr[i]),原来不是,这里要写成ByteStr[i].ToString()再convert,不然会变成该字符对应的十进制的值,而不是直接将string转成int;

5、貌似不太明白我在讲什么?- - ! 其实有些我也还是不太懂,不同语言之间这种转换有时真的挺蛋疼的,特别是c#调用c++函数的时候,有时一个类型都有好几种转换方式,感觉delphi跟c++有些地方挺像的,不知道上面说的够不够准确,转的对不对,比如delphi的copy()函数,我查了下用法和参数之后感觉应该就是c#的SubString(),实现的效果一样,但是不知道还有什么实质上的不同,比如光这个名字copy就会不禁想一想,拷贝?拷贝来做啥?关于delphi转c#,c++转c#,到现在已经查了N多资料了,就当做学习笔记吧,顺便分享。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: