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

  • 相关阅读:
    iis环境异常处理
    cmd常用命令:关机、注销、进入d盘等
    position
    Register Form
    第一周
    Django简介
    前端jQuery基本语法
    前端基础BOM和DOM
    HTML常用标签
    Linux相关 MySQL相关
  • 原文地址:https://www.cnblogs.com/linyc/p/2143489.html
Copyright © 2020-2023  润新知