Frédéric Lecointre
2011-Jan-24 17:40 UTC
Java implementation - about weak checksum difference
Hi all, I'm trying a java implementation of rsync for "fun and profits" ;-) helped by librsync 0.9.7 and jarsync (a died java implementation) So i started to implement rdiff command and for now i have a working signature command. With first test, i had the same signature file of testsuite/mksum.input/COPYING.sig but when i try with another dummy file, for each checksum pair : - each weak sum is different but just byte 1 and 3 - each strong sum is identical For example, this is the begenning of signature from and rdiff and java # From rdiff 72 73 01 36 00 00 08 00 00 00 00 08 <- header Pair 1 e1 c4 cd 65 <- weak 8b 4f 52 f9 d9 d2 27 e1 <- strong Pair 2 30 66 72 71 <- weak cd f6 1e 66 ac f2 af c5 <- strong # From java 72 73 01 36 00 00 08 00 00 00 00 08 <- header Pair 1 26 c4 ad 65 <- weak 8b 4f 52 f9 d9 d2 27 e1 Pair 2 c3 66 86 71 <- weak cd f6 1e 66 ac f2 af c5 <- strong Is anyone have an idea ? Thanks in advance. -- *Fr?d?ric Lecointre*
Frédéric Lecointre
2011-Jan-26 13:40 UTC
Java implementation - about weak checksum difference
Hi all, rs_calc_weak_sum, cast data from void to unsigned char. In C, unsigned char can represent values from 0 to 255 In Java, the smallest data type is the byte and it can represent values from -128 to 127 and there is not unsigned type. My implementation of weaksum use an array of bytes and do : int s2 += 4 * (s1 + buffer[i]) + 3 * buffer[i + 1] + 2 * buffer[i + 2] + buffer[i + 3] + 10 * RS_CHAR_OFFSET; In that, buffer[i] and others are silently converted to int. For example, if buffer[i] is a byte and value is 00E2 (226), (int)buffer[i] return FFE2 in java and not 00E2 as in c To have the correct value, i must do : int bt = (buffer[i] < 0) ? (int)buffer[i] & 0x00ff : (int)buffer[i]; And now, checksum is correct. Test of COPYING was successful because there's no byte with value greater than 127. So that problem is solved :-) ... for now ... Thanks for attention Le 24/01/2011 18:40, Fr?d?ric Lecointre a ?crit :> Hi all, > > I'm trying a java implementation of rsync for "fun and profits" ;-) > helped by librsync 0.9.7 and jarsync (a died java implementation) > So i started to implement rdiff command and for now i have a working > signature command. > > With first test, i had the same signature file of > testsuite/mksum.input/COPYING.sig but when i try with another dummy > file, for each checksum pair : > - each weak sum is different but just byte 1 and 3 > - each strong sum is identical > > For example, this is the begenning of signature from and rdiff and java > > # From rdiff > 72 73 01 36 00 00 08 00 00 00 00 08 <- header > Pair 1 > e1 c4 cd 65 <- weak > 8b 4f 52 f9 d9 d2 27 e1 <- strong > > Pair 2 > 30 66 72 71 <- weak > cd f6 1e 66 ac f2 af c5 <- strong > > # From java > 72 73 01 36 00 00 08 00 00 00 00 08 <- header > > Pair 1 > 26 c4 ad 65 <- weak > 8b 4f 52 f9 d9 d2 27 e1 > > Pair 2 > c3 66 86 71 <- weak > cd f6 1e 66 ac f2 af c5 <- strong > > Is anyone have an idea ? > > Thanks in advance.-- *Fr?d?ric Lecointre* -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.samba.org/pipermail/rsync/attachments/20110126/8a0663e3/attachment.html>