非接觸卡讀卡機與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;
}