デバイスからGPRSを介して受信しているAvlパケットがあります。
プロトコルマニュアルによると、パケットの最後の4バイトには16ビットのCRCがあり、CRC計算のソースコードは次のとおりです。
public static int getCrc16(Byte[] buffer) {
return getCrc16(buffer, 0, buffer.length, 0xA001, 0);
}
public synchronized static int getCrc16(Byte[] buffer, int offset, int bufLen, int polynom, int preset) {
preset &= 0xFFFF;
polynom &= 0xFFFF;
int crc = preset;
for (int i = 0; i < bufLen; i++) {
int data = buffer[i + offset] & 0xFF;
crc ^= data;
for (int j = 0; j < 8; j++) {
if ((crc & 0x0001) != 0) {
crc = (crc >> 1) ^ polynom;
} else {
crc = crc >> 1;
}
}
}
return crc & 0xFFFF;
}
パケットが送信するCRC番号を取得し、パケットを保存したByte配列に対してgetCrc16を呼び出して、2つの番号を比較します。
プログラム内で使用するコードは次のとおりです。
public static String toBinaryString(byte n) {
StringBuilder sb = new StringBuilder("00000000");
for (int bit = 0; bit < 8; bit++) {
if (((n >> bit) & 1) > 0) {
sb.setCharAt(7 - bit, '1');
}
}
return sb.toString();
}
int CalculatedCRC = getCrc16(AvlPacket);
System.out.println("Calculated CRC= " + CalculatedCRC);
int index = (AvlPacket.length)-4;
String BinaryRecievedCRC = "";
for (int j = 0; j < 4; j++) {
BinaryRecievedCRC+= toBinaryString(AvlPacket[index]);
index+=1;
}
int RecievedCRC = Integer.parseInt(BinaryRecievedCRC, 2);
System.out.println("Recieved CRC= " + RecievedCRC);
toBinaryString()は、バイトをからのバイナリに変換し、文字列に入れます!
そこで、マニュアルから提供されたgetCrc16()を使用してCRCを計算します。次に、パケットの終わりの4バイト前にインデックスを取得して、最後の4バイトを読み取り、パケットとともに送信されるCRCを取得できるようにします。
forループは最後の各バイトを受け取り、toBinaryString()を使用して、それらすべてをバイナリ形式で文字列に結合します!したがって、0000000000000000101011011101001のようなものが得られます(マニュアルには、最初の2バイトは16ビットCRCであるため、常にゼロであると記載されています)
したがって、バイナリ文字列を符号付き整数に解析し、2つのCRCを比較します...!
それでも私は次のような結果を得る:
計算されたCRC=21395-----受信されたCRC=30416
また
計算されたCRC=56084-----受信されたCRC=10504
私は多くのパケットでテストしましたが、すべてのパケットでデータが失われることはありません。また、データも解析しているので、取得したデータが正しいことがわかります。
私はこれすべてに何が欠けていますか?