1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-06-09 14:48:24 +02:00
Gadgetbridge/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/CheckSums.java
2017-04-09 01:09:43 +02:00

90 lines
3.2 KiB
Java

/* Copyright (C) 2015-2017 Carsten Pfeiffer
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.util;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class CheckSums {
public static int getCRC8(byte[] seq) {
int len = seq.length;
int i = 0;
byte crc = 0x00;
while (len-- > 0) {
byte extract = seq[i++];
for (byte tempI = 8; tempI != 0; tempI--) {
byte sum = (byte) ((crc & 0xff) ^ (extract & 0xff));
sum = (byte) ((sum & 0xff) & 0x01);
crc = (byte) ((crc & 0xff) >>> 1);
if (sum != 0) {
crc = (byte) ((crc & 0xff) ^ 0x8c);
}
extract = (byte) ((extract & 0xff) >>> 1);
}
}
return (crc & 0xff);
}
//thanks http://stackoverflow.com/questions/13209364/convert-c-crc16-to-java-crc16
public static int getCRC16(byte[] seq) {
int crc = 0xFFFF;
for (int j = 0; j < seq.length; j++) {
crc = ((crc >>> 8) | (crc << 8)) & 0xffff;
crc ^= (seq[j] & 0xff);//byte to int, trunc sign
crc ^= ((crc & 0xff) >> 4);
crc ^= (crc << 12) & 0xffff;
crc ^= ((crc & 0xFF) << 5) & 0xffff;
}
crc &= 0xffff;
return crc;
}
public static void main(String[] args) throws IOException {
if (args == null || args.length == 0) {
throw new IllegalArgumentException("Pass the files to be checksummed as arguments");
}
for (String name : args) {
try (FileInputStream in = new FileInputStream(name)) {
byte[] bytes = readAll(in, 1000 * 1000);
System.out.println(name + " : " + getCRC16(bytes));
}
}
}
// copy&paste of FileUtils.readAll() to have it free from Android dependencies
private static byte[] readAll(InputStream in, long maxLen) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream(Math.max(8192, in.available()));
byte[] buf = new byte[8192];
int read;
long totalRead = 0;
while ((read = in.read(buf)) > 0) {
out.write(buf, 0, read);
totalRead += read;
if (totalRead > maxLen) {
throw new IOException("Too much data to read into memory. Got already " + totalRead);
}
}
return out.toByteArray();
}
}