科班出身有科班的优势,一连趟了好多坑,终于学乖了

最近趟了好多的坑,唉,不是科班出身基础不好,迟早的事。

坑1、底层设备为啥只认十六进制整数呢

习惯了使用十进制,对于我们这种写惯了上层应用的老码农来说还真是不理解单片机等底层设备世界里那么的喜欢十六进制。设备的端口号是1-15 ,hex描述就是0-9,A-F。偏偏存储的时候是1十进制使用的时候忘记转换了,出现0-9正常,10-15出错,防不胜防啊。

一切都是习惯害的。

坑2、LRC算法计算校验码

string command = IntToHex_1_to_24(mbIndex) + "0100000030";
            //LRC
            int sum = 0;
            for (int i = 0; i < command.Length / 2; i++)
            {
                string val = command.Substring(i * 2, 2);
                sum += int.Parse(val, System.Globalization.NumberStyles.HexNumber);
            }
            byte result = (byte)((~sum) + 1);

 把全部字符转换成10进制的整数求和还进行补码就得到校验码。位运算,字长,字节,位这些概念晕头转向。当初计算机原理死活看不懂,问题来了,怎么当的程序员呢,唉,野生呗

坑3、delphi转C#的坑,都是常识惹的祸。真是要命啊转一段代码花了2天时间

delphi的字符串异或加解密:

{-------------------------------------------------------------------------------
函数说明:字符加密函數   這是用的一個異或加密
特别说明:在前面申明一个加密因子 const XorKey:array[0..7] of Byte=($B2,$09,$......);
其余备注:这种加密方法简单实用,用于重要数据的加密保存}
function strenc(Str:String):String;
var
  i,j:Integer;
begin
  Result:='';
  j:=0;
  for i:=1 to Length(Str) do
      begin
        Result:=Result+IntToHex(Byte(Str[i]) xor XorKey[j],2);
        j:=(j+1) mod 8;
      end;
end;
{-------------------------------------------------------------------------------
函数说明:字符串解密函数  这事用的一个异或的界蜜}
function strdec(Str:String):String;
var
  i,j:Integer;
begin
  Result:='';
  j:=0;
  for i:=1 to Length(Str) div 2 do
      begin
        Result:=Result+Char(StrToInt('$'+Copy(Str,i*2-1,2)) xor XorKey[j]);
        j:=(j+1) mod 8;
      end;
end;

常识问题:.net一个汉字的长度是1,而delphi自动是2,转换成Byte自动变成2个byte了,比如'足'字,delphi自动转换成2个byte{215,227}.就是这个问题导致字符和数字对了,汉字死活就是不对。回来使用两者IDE调试才知道差异,delphi的自动转换是使用了gb2312的字符集,本以为懂多种语言,转换是容易的事,没想到坑是趟大了。简单的换成各种语言的函数和表达式就对了,其实就是先入为主了,半天爬不出来。

        /// <summary>
        /// 字符串异或加密
        /// </summary>
        /// <param name="keyText">要加密的字符串</param>
        /// <returns></returns>
        public static string EncStringX(string keyText)
        {
            string result = string.Empty;           
            int j = 0;
            for (int i = 0; i < keyText.Length; i++)
            {
                byte[] chars = Encoding.GetEncoding("gb2312").GetBytes(keyText[i].ToString());
                foreach (byte b in chars)
                {
                    result += ((int)b^XorKey[j]).ToString("X2");
                    j = (j + 1) % 8;
                }
            }
            return result;
        }

        /// <summary>
        /// 字符串异或解密
        /// </summary>
        /// <param name="keyText">密文</param>
        /// <returns></returns>
        public static string DecStringX(string keyText)
        {
            IList<byte> list = new List<byte>();            
            int j = 0;
            for (int i = 0; i < keyText.Length/2; i++)
            {
                int b =  int.Parse(keyText.Substring(i*2,2), System.Globalization.NumberStyles.HexNumber)^XorKey[i];
                list.Add((byte)b);
                j = (j + 1) % 8;
            }
            byte[] buffer = list.ToArray();
            return Encoding.GetEncoding("gb2312").GetString(buffer);
        }

  

你可能感兴趣的:(科班出身有科班的优势,一连趟了好多坑,终于学乖了)