Added some masking to prevent a byte with the high bit set (0x80 or more) to flip into negative numbers; also altered to use an int in update.
This commit is contained in:
parent
27ee990c43
commit
6c241ea036
|
@ -40,7 +40,7 @@ public class CRC16 implements Checksum {
|
|||
*/
|
||||
private int update(int crc, byte[] bytes, int off, int len) {
|
||||
for (int i = off; i < (off + len); i++) {
|
||||
byte b = bytes[i];
|
||||
int b = (bytes[i] & 0xff);
|
||||
crc = (table[((crc >> 8) & 0xff) ^ b] ^ (crc << 8)) & 0xffff;
|
||||
}
|
||||
return crc;
|
||||
|
@ -64,7 +64,7 @@ public class CRC16 implements Checksum {
|
|||
* @param b input byte
|
||||
*/
|
||||
public void update(int b) {
|
||||
byte[] ba = { (byte) b };
|
||||
byte[] ba = { (byte) (b & 0xff) };
|
||||
value = update(value, ba, 0, 1);
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@ import java.io.UnsupportedEncodingException;
|
|||
import junit.framework.TestCase;
|
||||
|
||||
public class CRC16Test extends TestCase {
|
||||
|
||||
public void testTable() {
|
||||
int[] table = CRC16.getTable();
|
||||
assertEquals(0, table[0]);
|
||||
|
@ -30,4 +29,10 @@ public class CRC16Test extends TestCase {
|
|||
assertEquals(0x31c3, crc16.getValue());
|
||||
}
|
||||
|
||||
public void testVariousValues() throws UnsupportedEncodingException {
|
||||
CRC16 crc16 = new CRC16();
|
||||
byte[] data = new byte[] { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, (byte)0x80 };
|
||||
crc16.update(data);
|
||||
assertEquals(0x2299, crc16.getValue());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue