【Java-算法】 計算十六進制校驗位

如何計算16進制校驗位?
校驗的實質是16進製取和模256的值。git

eg. 十六進制串:0A0B0C0D0E0F 的校驗位是: 4B (HEX)
計算過程:spa

  1. 十六進制轉十進制 0A (HEX)= 10(DEC),以此類推
  2. 計算和 10+11+12+13+14+15=75 (DEC) 
  3. 取餘 75%256=75
  4. 十進制轉十六進制 75(DEC)= 4B(HEX)

Java Code:code

public class CalculateCheckDigit {

    /** 輸入十六進制,輸出兩位校驗位 */
    public static void main(String args[]) {
        String sHex = "01 F1 00 04 03 06 01 B0";// 輸入十六進制
        sHex = sHex.replace(" ", "");// 去掉中間空格
        String result = makeCheckSum(sHex);// 計算並獲取校驗位
        System.out.println(result);// 輸入兩位校驗位 結果是B0
    }

    /** 計算校驗位 ,返回十六進制校驗位 */
    private static String makeCheckSum(String data) {
        int dSum = 0;
        int length = data.length();
        int index = 0;
        // 遍歷十六進制,並計算總和
        while (index < length) {
            String s = data.substring(index, index + 2); // 截取2位字符
            dSum += Integer.parseInt(s, 16); // 十六進制轉成十進制 , 並計算十進制的總和
            index = index + 2;
        }

        int mod = dSum % 256; // 用256取餘,十六進制最大是FF,FF的十進制是255
        String checkSumHex = Integer.toHexString(mod); // 餘數轉成十六進制
        length = checkSumHex.length();
        if (length < 2) {
            checkSumHex = "0" + checkSumHex;  // 校驗位不足兩位的,在前面補0
        }
        return checkSumHex;
    }
}

 

爲何要計算校驗位?校驗位的原理是什麼?blog

檢驗和(checksum),在數據處理和數據通訊領域中,用於校驗目的地一組數據項的和。它一般是以十六進制爲數製表示的形式。若是校驗和的數值超過十六進制的FF,也就是255,就要求其補碼做爲校驗和。一般用來在通訊中,尤爲是遠距離通訊中保證數據的完整性和準確性。string

相關文章
相關標籤/搜索