非接觸卡讀卡器與PC機的通訊格式如下:
STX(02H)+ 6個字節的卡號+VERH+VERL+EOT(04H) STX(02H)起始字節 EOT(04H)結束字節 6個字節的卡號爲六個十六進制的ASCII字符,6個字節的傳送,高字節在前,低字節在後。例如: 卡 號: 8 D E F 9 E 傳輸的數據格式:38 44 45 46 39 45 (十六進制) 在校驗時採用目前最通用的BCC校驗方式: 具體的方法是: 將有效的卡號接字節作異或(XOR)校驗: 38H (XOR)44H (XOR)45H (XOR)46H (XOR)39H(XOR)45H =03H 然後將接收到的數據VERH+VERL合成一個字節數據,30H(HEX)=0,33H(HEX)=3 合成數據爲03H,接收到的數據與我們收到的卡號的校驗數據一致,則接收到 的卡號爲正確卡號。 再比如現有卡號爲: 卡 號: 0 5 8 E 4 2 傳輸的數據格式:30 35 38 45 34 32 (十六進制) 在校驗時採用目前最通用的BCC校驗方式: 具體的方法是: 將有效的卡號接字節作異或(XOR)校驗: 30H (XOR)35H (XOR)38H (XOR)45H (XOR)34H(XOR)32H =7EH 然後將接收到的數據VERH+VERL合成一個字節數據,37H(HEX)=7,45H(HEX)=E 合成數據爲7EH,接收到的數據與我們收到的卡號的校驗數據一致,則接收到 的卡號爲正確卡號。 在編寫程序時,可以先將所有數據都接收到計算機的內存中,然後計算BCC校驗值VALUE1,再將接收的BCC值 拼成一個十六進制數VALUE2,然後比較這兩個值,如果相等,則接收到的卡號爲合法卡號,然後按您的系統 作相應的處理。
public static String getBCC(byte[] data) {
String ret = "";byte BCC[]= new byte[1];
for(int i=0;i<data.length;i++)
{
BCC[0]=(byte) (BCC[0] ^ data[i]);
}
String hex = Integer.toHexString(BCC[0] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
return ret;
}