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

摘要:
事实上,我仍然不理解其中的一些。有时候,不同语言之间的这种转换真的很痛苦。特别是当C#调用C++函数时,有时有几种类型的转换方法。我觉得delphi在某些方面类似于C++。我不知道上面的内容是否足够准确,转换是否正确,比如delphi的copy()函数。我检查了用法

例一

实现目的:将字符串中每一个字符转成二进制(比如 '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多资料了,就当做学习笔记吧,顺便分享。

免责声明:文章转载自《delphi 对应 c# 的一些函数及类型的转换方法【原】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇GCC选项之-MOpenGL ES on iOS --- 统一变量(Uniform)和统一变量块(UBO)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java 访问 C++ 方法:JavaCPP

JavaCPP提供了在Java中高效访问本地C++的方法。采用JNI技术实现,支持所有Java实现包括Android系统,Avian 和 RoboVM。 JavaCPP提供了一系列的Annotation将java代码映射到C++代码,并使用一个可执行的jar包将C++代码转化为可以从JVM内调用的动态链接库文件。 Maven: <dependency...

C++ 解析Json——jsoncpp

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似,本文主要对VS2008中使用Jsoncpp解析json的方法做一下记录。Jsoncpp是个跨平台的开源库,下载地址:http://sourceforge.net/projects/jsoncpp/。 方法一:使用Jsoncpp生成的lib文件 解压上...

shiro 框架基本讲解【转载】

shiro 框架基本讲解【转载】 什么是权限管理: 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问...

使用java防止非法请求

1.过滤器 public class ImgFilter implementsFilter { @Override public void init(FilterConfig filterConfig) throwsServletException { System.out.println("过滤器开始!!!");...

初探机器学习之使用讯飞TTS服务实现在线语音合成

最近在调研使用各个云平台提供的AI服务,有个语音合成的需求因此就使用了一下科大讯飞的TTS服务,也用.NET Core写了一个小示例,下面就是这个小示例及其相关背景知识的介绍。 一、什么是语音合成(TTS) 1.1 What is 语音合成? 将文字信息转化为声音信息,给应用配上“嘴巴”,这就是语音合成。 Note:语音合成和语音识别技术是实现人机语音通...

UVM基础之----uvm_object

uvm_void The uvm_void class is the base class for all UVM classes. uvm_object: The uvm_object class is the base class for all UVM data and hierarchical classes. uvm_object是一个uvm...