HuskyBaseUtils.java
Go to the documentation of this file.
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         //CRC lookup table for polynomial 0x1021
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         // Test a couple of known checksum values
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         // Confirmation
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     // Memory-helper function, only used for debugging
00105     public static String byteArrayToString(byte[] data) {
00106         return new String(Hex.encodeHex(data));
00107     }
00108 }


android_base_controller
Author(s):
autogenerated on Fri Aug 28 2015 10:04:47