Wyliczanie CRC-16 w C#

Spędziłem nad zagadnieniem wyliczania sumy kontrolnej CRC-16 z ciągu bajtów dobrą chwilę czasu, dlatego poniżej przedstawiam rozwiązanie, aby pozostali nie musieli już się w to bawić… Wybrałem wersję szybką, z użyciem statycznej tablicy potęg. Dlatego też na początku definiujemy ową tablicę:
private ushort[] crctable = new ushort[256] {
                0x0000,	0x1021,	0x2042,	0x3063,	0x4084,	0x50a5,	0x60c6,	0x70e7,
                0x8108,	0x9129,	0xa14a,	0xb16b,	0xc18c,	0xd1ad,	0xe1ce,	0xf1ef,
                0x1231,	0x0210,	0x3273,	0x2252,	0x52b5,	0x4294,	0x72f7,	0x62d6,
                0x9339,	0x8318,	0xb37b,	0xa35a,	0xd3bd,	0xc39c,	0xf3ff,	0xe3de,
                0x2462,	0x3443,	0x0420,	0x1401,	0x64e6,	0x74c7,	0x44a4,	0x5485,
                0xa56a,	0xb54b,	0x8528,	0x9509,	0xe5ee,	0xf5cf,	0xc5ac,	0xd58d,
                0x3653,	0x2672,	0x1611,	0x0630,	0x76d7,	0x66f6,	0x5695,	0x46b4,
                0xb75b,	0xa77a,	0x9719,	0x8738,	0xf7df,	0xe7fe,	0xd79d,	0xc7bc,
                0x48c4,	0x58e5,	0x6886,	0x78a7,	0x0840,	0x1861,	0x2802,	0x3823,
                0xc9cc,	0xd9ed,	0xe98e,	0xf9af,	0x8948,	0x9969,	0xa90a,	0xb92b,
                0x5af5,	0x4ad4,	0x7ab7,	0x6a96,	0x1a71,	0x0a50,	0x3a33,	0x2a12,
                0xdbfd,	0xcbdc,	0xfbbf,	0xeb9e,	0x9b79,	0x8b58,	0xbb3b,	0xab1a,
                0x6ca6,	0x7c87,	0x4ce4,	0x5cc5,	0x2c22,	0x3c03,	0x0c60,	0x1c41,
                0xedae,	0xfd8f,	0xcdec,	0xddcd,	0xad2a,	0xbd0b,	0x8d68,	0x9d49,
                0x7e97,	0x6eb6,	0x5ed5,	0x4ef4,	0x3e13,	0x2e32,	0x1e51,	0x0e70,
                0xff9f,	0xefbe,	0xdfdd,	0xcffc,	0xbf1b,	0xaf3a,	0x9f59,	0x8f78,
                0x9188,	0x81a9,	0xb1ca,	0xa1eb,	0xd10c,	0xc12d,	0xf14e,	0xe16f,
                0x1080,	0x00a1,	0x30c2,	0x20e3,	0x5004,	0x4025,	0x7046,	0x6067,
                0x83b9,	0x9398,	0xa3fb,	0xb3da,	0xc33d,	0xd31c,	0xe37f,	0xf35e,
                0x02b1,	0x1290,	0x22f3,	0x32d2,	0x4235,	0x5214,	0x6277,	0x7256,
                0xb5ea,	0xa5cb,	0x95a8,	0x8589,	0xf56e,	0xe54f,	0xd52c,	0xc50d,
                0x34e2,	0x24c3,	0x14a0,	0x0481,	0x7466,	0x6447,	0x5424,	0x4405,
                0xa7db,	0xb7fa,	0x8799,	0x97b8,	0xe75f,	0xf77e,	0xc71d,	0xd73c,
                0x26d3,	0x36f2,	0x0691,	0x16b0,	0x6657,	0x7676,	0x4615,	0x5634,
                0xd94c,	0xc96d,	0xf90e,	0xe92f,	0x99c8,	0x89e9,	0xb98a,	0xa9ab,
                0x5844,	0x4865,	0x7806,	0x6827,	0x18c0,	0x08e1,	0x3882,	0x28a3,
                0xcb7d,	0xdb5c,	0xeb3f,	0xfb1e,	0x8bf9,	0x9bd8,	0xabbb,	0xbb9a,
                0x4a75,	0x5a54,	0x6a37,	0x7a16,	0x0af1,	0x1ad0,	0x2ab3,	0x3a92,
                0xfd2e,	0xed0f,	0xdd6c,	0xcd4d,	0xbdaa,	0xad8b,	0x9de8,	0x8dc9,
                0x7c26,	0x6c07,	0x5c64,	0x4c45,	0x3ca2,	0x2c83,	0x1ce0,	0x0cc1,
                0xef1f,	0xff3e,	0xcf5d,	0xdf7c,	0xaf9b,	0xbfba,	0x8fd9,	0x9ff8,
                0x6e17,	0x7e36,	0x4e55,	0x5e74,	0x2e93,	0x3eb2,	0x0ed1,	0x1ef0
         };
Dzięki takiej tablicy, sama funkcja wyliczająca przedstawia się już banalnie i działa rewelacyjnie szybko:
//! Wyliczenie sumy kontrolnej CRC16
public ushort CRC16(string tekst, int ile) 
{
 ushort crc;

 //crc = 0xffff;
 crc = 0;
 for (int i = 0; i < ile; i++)
 {
   crc = (ushort)(( crc << 8 ) ^ crctable[ ( crc >> 8 ) ^ tekst[i] ]);
 }
 crc ^= 0x0000;
 return crc;
}
I to w zasadzie wszystko! 🙂 Należy jedynie upewnić się, jaką wartość początkową chcemy przyjmować – ja potrzebowałem wartość 0, czasami stosuje się 0xffff, jak to widać w zakomentowanej linijce powyżej.
Przykładowe użycie funkcji może wyglądać tak:
ramka = "" + (char)0x01 + (char)0x0C + (char)0x14 + klucz + (char)0x00; // C_LoadKeyToDKB
crc = CRC16(ramka, klucz.Length + 4);
ramka = ramka + (char)( crc >> 8 ) + (char)(crc & 0x00FF);
Facebooktwittergoogle_plusredditpinterestlinkedinmail
twitterlinkedin

u3shaders dla S.T.A.L.K.E.R.: Cień Czarnobyla

u3shaders 2.1 to zestaw shaderów, zarówno dla DirectX8 jak i DirectX9 (odpowiednio opcje „oświetlenie statyczne” i „oświetlenie dynamiczne„) do gry S.T.A.L.K.E.R.: Cień Czarnobyla. Prace nad shaderami rozpocząłem pod koniec 2009 roku i z przerwami kontynuuję do dziś. Najnowsza wersja, u3shaders 2.1, wprowadza w stosunku do wersji 2.0 poprawkę w algorytmie wyliczania cieni, naprawiając najpoważniejszy błąd całego zestawu. Jeśli ktoś nie wie, do czego służą shadery, wyjaśniam: zmieniają sposób wyświetlania obrazu. W tym przypadku, u3shaders wprowadza grę Stalker w świat realistycznej grafiki. Oczywiście, warto zainwestować również te kilkaset megabajtów w jakieś sensowne tekstury…

     

Link do pobrania oraz dyskusję można znaleźć na forum stalker.pl.
Facebooktwittergoogle_plusredditpinterestlinkedinmail
twitterlinkedin

Instalacja Ruby on Rails na maszynie linuksowej

Proces okazał się o tyle skomplikowany, iż przyszło mi pracować na stareńkiej już dystrybucji Slackware 11.0. Dlatego też pierwszym krokiem, jaki musiałem wykonać, była aktualizacja Ruby’ego. Ja wybrałem na początek wersję 1.8.7:
wget http://ftp.slackware.pl/pub/slackware/slackware-12.2/patches/source/ruby/ruby.SlackBuild
wget http://ftp.slackware.pl/pub/slackware/slackware-12.2/patches/source/ruby/ruby-1.8.7-p174.tar.bz2
chmod 755 ruby.SlackBuild
su
./ruby.SlackBuild
mv /tmp/ruby-1.8.7_p174-i486-1_slack12.2.tgz ./ruby-1.8.7_p174-i486-1_slack11.0.tgz
upgragepkg ruby-1.8.7_p174-i486-1_slack11.0.tgz
Test instalacji:
ruby --version
ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]
Kolejnym krokiem jest instalacja RubyGems, zarządcy pakietów Ruby’ego:
wget http://slackbuilds.org/slackbuilds/13.0/system/rubygems.tar.gz
tar zxf rubygems.tar.gz
cd rubygems
cat rubygems.info
wget http://rubyforge.org/frs/download.php/57643/rubygems-1.3.4.tgz
su
./rubygems.SlackBuild
mv /tmp/rubygems-1.3.4-i486-1_SBo.tgz .
installpkg rubygems-1.3.4-i486-1_SBo.tgz
Mając działający RubyGems, przystępujemy do najważniejszego zadania – instalacji Rails. Niestety, w zestawie wersji takim, jak powyżej, należy zainstalować starszą wersję Rails, np.:
gem instal rails --version=1.1.6
Po zainstalowaniu samych pakietów, instalator przechodzi od razu do instalacji dokumentacji. Jeżeli z jakiegoś powodu nie będzie się wam chciało czekać, można ten proces przerwać, sama biblioteka Rails będzie działać poprawnie.
Pozostaje instalacja supportu różnych silników baz danych, które będziemy chcieli wykorzystywać w naszych aplikacjach, np.:
gem install mysql
Oczywiście, nic nie stoi na przeszkodzie, aby zainstalować jeszcze wyższe wersje – zwłaszcza pakietu RubyGems, ale to już wiąże się z napisaniem własnych skryptów SlackBuild. Na szczęście, wystarczy wzorować się na skryptach do starszych wersji 🙂
Facebooktwittergoogle_plusredditpinterestlinkedinmail
twitterlinkedin