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