在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
例一 实现目的:将字符串中每一个字符转成二进制(比如 '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;
|
请发表评论