网络数据校验随笔(1)

第一个学期快结束了。

这一个学期里从开始到现在,对于自己的学习状态持加勉态度,以此为戒,继续努力!

学期末一共做了两门课程设计:计算机网络数据校验、指令系统设计

网络数据校验是第一门课程设计,对于数据校验的校验方法主要是:奇偶校验、CRC校验、IP、TCP、UDP校验和的计算

奇偶校验

  对于奇偶校验来说,我的理解就是将数据转换成规范的二进制,将最高位或者最低位作为校验位,然后根据二进制中1的个数,奇校验则是将数据中1的个数相加得和,如果和是奇数个,则将校验位置0,否则置1;偶校验同理。

  矩阵校验的话是将数据按8的倍数为单位排成N排,将数据的最低位做校验位,进行校验。将每一列当做数据,在矩阵的最后一排添加一排校验位,进行校验。

  在动手做之后,出现的第一个问题:如何将汉字转换成规范的二进制?

  之前只听说过因为汉字比较复杂,一般都是用2个字节来存储。所以经过String类中的getBytes()方法实践过后,得出以下经验。

  # getBytes(String charsetName)

  - charsetName 不同的编码形式。"UTF-8"、"GBK"...

  根据不同的编码形式会得到不同的字节数组,我使用的是GBK编码,一个汉字经过编码之后得到两个数值为负的数据,UTF-8则有三个,不同的编码得到的数据不一样。

  之后通过Integer中的toBinaryString()将得到的编码之后的数据转换成二进制字符串。

  # toBinaryString(int i)

  - i int 类型的一个数据

  转换之后的二进制串是以补码的形式显示的。

  具体转换过程:

  

String s = "啊";
        byte b[] = s.getBytes("GBK");
        String s1[] = new String[b.length];
        for (int i = 0; i < s1.length; i++) {
            s1[i] = Integer.toBinaryString(b[i] & 0xff);
        }
        byte a[] = new byte[s1.length];
        for (int i = 0; i < a.length; i++) {
            a[i] = (byte) ArithmeticFactory.aBinaryStringToInteger(s1[i]);
        }
        System.out.println(new String(a));
View Code

  之后的问题就比较容易了,在一个字节的最高位或最低位添加校验位进行校验即可完成奇偶校验了。

  ps.对于博文中的错误或对叙述存在疑问的欢迎留言,小弟不胜感激。

  

  

  

原文地址:https://www.cnblogs.com/H-Col/p/3515526.html