में कनवर्ट करें मैं वर्तमान में एक परियोजना पर काम कर रहा हूं, जिसमें एक एम्बेडेड सिस्टम रेडियो के माध्यम से एक पीसी को डेटा भेज रहा है। पैकेट अंत में एक CRC16 चेकसम मिलता है और यह इस एल्गोरिथ्म आधार पर की जाती है:सी सीआरसी 16 को जावा सीआरसी 16
uint16_t crc16 (const uint8_t * buffer, uint32_t size) {
uint16_t crc = 0xFFFF;
if (buffer && size)
while (size--)
{
crc = (crc >> 8) | (crc << 8);
crc ^= *buffer++;
crc ^= ((unsigned char) crc) >> 4;
crc ^= crc << 12;
crc ^= (crc & 0xFF) << 5;
}
return crc;
}
अब मैं जावा में एक बराबर रहा हूँ। http://introcs.cs.princeton.edu/java/51data/CRC16CCITT.java.html
public class CRC16CCITT {
public static void main(String[] args) {
int crc = 0xFFFF; // initial value
int polynomial = 0x1021; // 0001 0000 0010 0001 (0, 5, 12)
// byte[] testBytes = "123456789".getBytes("ASCII");
byte[] bytes = args[0].getBytes();
for (byte b : bytes) {
for (int i = 0; i < 8; i++) {
boolean bit = ((b >> (7-i) & 1) == 1);
boolean c15 = ((crc >> 15 & 1) == 1);
crc <<= 1;
if (c15^bit) crc ^= polynomial;
}
}
crc &= 0xffff;
System.out.println("CRC16-CCITT = " + Integer.toHexString(crc));
}
}
लेकिन मेरी सी कोड के साथ यह does not काम: मैं पहले से ही यहाँ एक अच्छा एक मिल गया।
क्या कोई सी और जावा समकक्ष एल्गोरिदम के लिए अनुकूलन या समाधान प्रदान करने में सक्षम है? धन्यवाद!
क्यों आप हर यात्रा पर 'सीआरसी =' सेट कर रहे हैं के रूप में इस प्रत्येक मान लेकिन पिछले अनदेखी रूप में ही है:
यह मेरा कार्यान्वयन है। –
तो मुझे तब क्या लिखना है? सीआरसी^=? मैंने बस एक ओपन सोर्स प्रोजेक्ट से कोड कॉपी किया है जिनके साथ मैंने काम किया था। – tellob
इस से सीआरसी की गणना करने के बहुत तेज़ तरीके हैं। खोज जारी रखिये। एक टेबल संचालित विधि है। – EJP