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多资料了,就当做学习笔记吧,顺便分享。