Thread View: pl.comp.lang.java
3 messages
3 total messages
Started by bigMamma
Sat, 19 Oct 2013 17:21
obliczenie sumy kontrolnej (w C+ działa) a w java?
Author: bigMamma
Date: Sat, 19 Oct 2013 17:21
Date: Sat, 19 Oct 2013 17:21
26 lines
1941 bytes
1941 bytes
Dzień dobry,
mam następujący problem.
Oryginalny kod w C+:
short CalcCrc(char *str,int len)
{
short crc=0;
for(int i=0;i<len;i++)
crc ^= (short)((unsigned char)str[i]) << (i%9);
return crc;
}
wylicza sumę kontrolną. Przepisałem to w Java:
public static byte [] CRC(byte[] dane) {
short crc = 0;
for (int i = 0; i < dane.length; i++) {
crc ^= (short)(( char)dane[i]) << (i%9);
}
String w = String.format("%04X", crc);
return w.getBytes();
}
niestety, nie zwraca mi prawidłowej sumy kontrolnej. Czy mogę prosić o pomoc?
ps. operacja na CRC to ma być XOR z 16 bitową liczbą, przsuniętą w lewo o modulo z 9 do swojej pozycji.
Re: obliczenie sumy kontrolnej (w C+ działa) a w java?
Author: Arivald
Date: Sat, 19 Oct 2013 18:05
Date: Sat, 19 Oct 2013 18:05
38 lines
2027 bytes
2027 bytes
W dniu 2013-10-19 19:21, bigMamma pisze:
> Dzień dobry,
> mam następujący problem.
> Oryginalny kod w C+:
>
> short CalcCrc(char *str,int len)
> {
> short crc=0;
> for(int i=0;i<len;i++)
> crc ^= (short)((unsigned char)str[i]) << (i%9);
> return crc;
> }
>
> wylicza sumę kontrolną. Przepisałem to w Java:
>
> public static byte [] CRC(byte[] dane) {
>
> short crc = 0;
> for (int i = 0; i < dane.length; i++) {
> crc ^= (short)(( char)dane[i]) << (i%9);
> }
> String w = String.format("%04X", crc);
> return w.getBytes();
> }
>
> niestety, nie zwraca mi prawidłowej sumy kontrolnej. Czy mogę prosić o pomoc?
> ps. operacja na CRC to ma być XOR z 16 bitową liczbą, przsuniętą w lewo o modulo z 9 do swojej pozycji.
>
"char" w javie jest 2 bajtowy. użyj zamiast tego "byte"
Po za tym dane wejściowe są już "byte", rzut niepotrzebny. W C jest
rzut, dla uzyskania "unsigned", bo "char" w C jest "signed".
--
Arivald
Re: obliczenie sumy kontrolnej (w C+ działa) a w java?
Author: bigMamma
Date: Sun, 20 Oct 2013 17:35
Date: Sun, 20 Oct 2013 17:35
90 lines
2975 bytes
2975 bytes
W dniu sobota, 19 października 2013 20:05:35 UTC+2 użytkownik Arivald napisał:
> W dniu 2013-10-19 19:21, bigMamma pisze:
>
> > Dzień dobry,
>
> > mam następujący problem.
>
> > Oryginalny kod w C+:
>
> >
>
> > short CalcCrc(char *str,int len)
>
> > {
>
> > short crc=0;
>
> > for(int i=0;i<len;i++)
>
> > crc ^= (short)((unsigned char)str[i]) << (i%9);
>
> > return crc;
>
> > }
>
> >
>
> > wylicza sumę kontrolną. Przepisałem to w Java:
>
> >
>
> > public static byte [] CRC(byte[] dane) {
>
> >
>
> > short crc = 0;
>
> > for (int i = 0; i < dane.length; i++) {
>
> > crc ^= (short)(( char)dane[i]) << (i%9);
>
> > }
>
> > String w = String.format("%04X", crc);
>
> > return w.getBytes();
>
> > }
>
> >
>
> > niestety, nie zwraca mi prawidłowej sumy kontrolnej. Czy mogę prosić o pomoc?
>
> > ps. operacja na CRC to ma być XOR z 16 bitową liczbą, przsuniętą w lewo o modulo z 9 do swojej pozycji.
>
> >
>
>
>
>
>
> "char" w javie jest 2 bajtowy. użyj zamiast tego "byte"
>
>
>
> Po za tym dane wejściowe są już "byte", rzut niepotrzebny. W C jest
>
> rzut, dla uzyskania "unsigned", bo "char" w C jest "signed".
>
>
>
>
>
> --
>
> Arivald
Dziękuję serdecznie!
Rzeczywiście, teraz działa!
public static byte [] CRC(byte[] dane) {
short crc = 0;
for (int i = 0; i < dane.length; i++) {
crc ^= (short)((byte)dane[i]) << (i % 9);
}
String w = String.format("%04X", crc);
return w.getBytes();
}
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads