00001 package com.github.c77.base_driver.husky;
00002
00003 import org.apache.commons.codec.binary.Hex;
00004
00005 import java.util.Arrays;
00006
00010 public class HuskyBaseUtils {
00011
00022 public static char checkSum(byte[] cmdPackage) {
00023
00024 char table[] = {
00025 0x0, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
00026 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
00027 0x1231, 0x210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
00028 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
00029 0x2462, 0x3443, 0x420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
00030 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
00031 0x3653, 0x2672, 0x1611, 0x630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
00032 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
00033 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x840, 0x1861, 0x2802, 0x3823,
00034 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
00035 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0xa50, 0x3a33, 0x2a12,
00036 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
00037 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0xc60, 0x1c41,
00038 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
00039 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0xe70,
00040 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
00041 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
00042 0x1080, 0xa1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
00043 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
00044 0x2b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
00045 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
00046 0x34e2, 0x24c3, 0x14a0, 0x481, 0x7466, 0x6447, 0x5424, 0x4405,
00047 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
00048 0x26d3, 0x36f2, 0x691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
00049 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
00050 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x8e1, 0x3882, 0x28a3,
00051 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
00052 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0xaf1, 0x1ad0, 0x2ab3, 0x3a92,
00053 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
00054 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0xcc1,
00055 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
00056 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0xed1, 0x1ef0
00057 };
00058
00059 int size = cmdPackage.length - 2;
00060 char checksum = 0xFFFF;
00061 int counter = 0;
00062 while(counter < size) {
00063 checksum = (char) ((char)(checksum << 8) ^ table[((checksum >> 8)^cmdPackage[counter]) & 0xFF]);
00064 counter++;
00065 }
00066 return checksum;
00067 }
00068
00072 public static void main(String args[]) throws Exception {
00073 System.out.println("--> " + HuskyBaseUtils.byteArrayToString(new byte[] {
00074 0x14, 0x24, 0x4A, 0x77
00075 }));
00076
00077
00078 testChecksum("aa0df200080400000004025501000000","d829");
00079 testChecksum("aa11ee01f40700000004025500000000000000","0dca");
00080 }
00081 public static void testChecksum(String inputString, String expectedSum) throws Exception {
00082 byte[] sample = Hex.decodeHex(inputString.toCharArray());
00083 byte[] sampleCheckSum = Hex.decodeHex(expectedSum.toCharArray());
00084 char checksum = checkSum(sample);
00085 byte[] result = {
00086 (byte)(checksum & 0xFF),
00087 (byte)((checksum >> 8) & 0xFF)
00088 };
00089 System.out.println("Calculated checksum: " + byteArrayToString(result) + " vs expected: " + expectedSum);
00090
00091
00092 char checksumComp = (char)(checksum ^ 0xFFFF);
00093 byte verifySample[] = Arrays.copyOf(sample, sample.length + 2);
00094 verifySample[verifySample.length - 4] = (byte)(checksumComp & 0xFF);
00095 verifySample[verifySample.length - 3] = (byte)(checksumComp >> 8);
00096 char verifier = checkSum(verifySample);
00097 byte[] verifierResult = {
00098 (byte)(verifier & 0xFF),
00099 (byte)((verifier >> 8) & 0xFF)
00100 };
00101 System.out.println("Verifier = " + byteArrayToString(verifierResult));
00102 }
00103
00104
00105 public static String byteArrayToString(byte[] data) {
00106 return new String(Hex.encodeHex(data));
00107 }
00108 }