1. 程式人生 > 其它 >奇偶校驗碼(Parity Code)

奇偶校驗碼(Parity Code)

技術標籤:java其他校驗碼奇偶校驗奇偶校驗碼

文章目錄

校驗碼

計算機系統執行時,為了確保資料在傳遞過程中正確無誤,一是提高硬體電路的可靠性,二是提高程式碼的校驗能力,包括查錯與糾錯。通常使用校驗碼的方法來檢測傳送的資料是否出錯。其基本思想是把資料可能出現的編碼分為兩類:合法編碼與錯誤編碼。合法編碼用於傳送資料,錯誤編碼是不允許在資料中出現的編碼。合理的設計錯誤編碼以及編碼規則,使得資料在傳送中出現錯誤時會變為錯誤編碼,這樣就可以檢測出接收的資料是否有錯。

術語

碼字:是指編碼系統中的合法編碼稱為碼字。
碼距:是指編碼系統中任意兩個合法編碼之間至少有多少個二進位制位不同。如:合法編碼為11、00,那麼11與00之間至少有兩個二進位制位不同,所以碼距為2。

奇偶校驗

奇偶校驗是一種簡單有效的校驗方法。這種方法通過在編碼中增加一位校驗位來使編碼中1的個數為奇數或者偶數,從而使碼距變為2。對於奇校驗來說,它可以檢測奇數位出錯的編碼,但不能發現偶數位出錯的編碼。也就是說,奇數為1的合法編碼發生了奇數位的錯誤,會導致1的個數不為奇數,從而檢出問題。

奇校驗例圖:
在這裡插入圖片描述
奇校驗的校驗位,根據資料位的1的個數是否為奇數,來確定校驗位應該是0還是1。如果資料位的1的個數是偶數,則校驗位補1,使其整個編碼的1的個數變為奇數。

偶校驗例圖:
在這裡插入圖片描述
偶校驗的校驗位,根據資料位的1的個數是否為偶數,來確定校驗位應該是0還是1。如果資料位的1的個數是奇數,則校驗位補1,使其整個編碼的1的個數變為偶數,如果資料位的1個數為偶數,則校驗位補0,使其依然為偶數。

java程式碼

public class ParityCheck {

    /**
     * 偶校驗
     *
     * @param checkBytes 需要檢查的位元組陣列
     * @param full       checkBytes的所有位元組累計進行奇偶校驗 。true-所有;false-只要有一個位元組不通過奇偶校驗就直接返回false。
     * @return 是否校驗通過
     */
    public static boolean evenNumberCheck(byte[] checkBytes, boolean full) {
        return
parityCheck(checkBytes, false, full); } /** * 奇校驗 * * @param checkBytes 需要檢查的位元組陣列 * @param full checkBytes的所有位元組累計進行奇偶校驗 。true-所有;false-只要有一個位元組不通過奇偶校驗就直接返回false。 * @return 是否校驗通過 */ public static boolean oddNumberCheck(byte[] checkBytes, boolean full) { return parityCheck(checkBytes, true, full); } /** * 奇偶校驗 * * @param checkBytes 需要檢查的位元組陣列 * @param odd 是否奇校驗。true-校驗,false-偶校驗 * @param full checkBytes的所有位元組累計進行奇偶校驗 。true-所有;false-只要有一個位元組不通過奇偶校驗就直接返回false。 * @return 是否校驗通過 */ public static boolean parityCheck(byte[] checkBytes, boolean odd, boolean full) { byte checkMask = 0x1; int oddSum = 0; int byteSize = 8;// for (byte checkByte : checkBytes) { for (int i = 0; i < byteSize; i++) { if ((checkByte >> i & checkMask) == 1) { oddSum++; } } if (!full) { if (!(odd == isOdd(oddSum))) { return false; } oddSum = 0; } } return !full || odd == isOdd(oddSum); } /** * 判斷傳入的整數是否為奇數 * * @param checkInt 校驗整數 * @return true-奇數;false-偶數 */ public static boolean isOdd(long checkInt) { boolean isOddNumber = false; byte checkMask = 0x1; if ((checkInt & checkMask) == 1) {//通過校驗最後一位是否為1,來判斷是否為奇數。 //為1的bit位數量為奇數 isOddNumber = true; } return isOddNumber; } public static void main(String[] args) { String bs1 = "01101011"; byte b1 = (byte) Integer.parseInt(bs1, 2); byte[] checkBytes = new byte[]{b1}; System.out.println("校驗碼:" + bs1 + " 奇校驗:" + oddNumberCheck(checkBytes, false)); //奇數校驗 System.out.println("校驗碼:" + bs1 + " 偶校驗:" + evenNumberCheck(checkBytes, false)); //偶數校驗 } }