utak3r's virtual shelter

?>

Miesiąc: wrzesień 2010

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);

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…

Tutaj były kiedyś screenshoty… hmm.

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

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 🙂

Oparte na WordPress & Theme by Anders Norén

Aby kontynuować przeglądanie tej witryny, wyraź zgodę na przechowywanie plików cookie. więcej informacji

Ta witryna używa plików cookie dla największej wygody użytkowania. Kliknij "Zaakceptuj", aby wyrazić zgodę na przechowywanie plików cookie.

Zamknij