delphi 对应 c# 的一些函数及类型的转换方法(从网络摘录)

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

例一
实现目的:将字符串中每一个字符转成二进制(比如 '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多资料了,就当做学习笔记吧,顺便分享。
原文地址:https://www.cnblogs.com/Anguo/p/7196272.html