Важный код но на с

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Fisher
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 06.11.2005 (Вс) 13:12

Важный код но на с

Сообщение Fisher » 06.11.2005 (Вс) 13:36

Код: Выделить всё
/* thanks to RElf (spam4relf@chat.ru) */
#include <stdio.h>
#include <string.h>
#include "Getkeys.h"


/* Load long from address C into LL with bytes swapped. */
#define N2L(C, LL) \
    LL  = ((unsigned int)(*((C)++))) << 24, \
    LL |= ((unsigned int)(*((C)++))) << 16, \
    LL |= ((unsigned int)(*((C)++))) << 8, \
    LL |= ((unsigned int)(*((C)++)))

/* we need less than 32 bytes to get k0, but we need at least 40 bytes to get k1... */
#define SIZE 62

static unsigned int key0[62+1];
static unsigned int key1[62+1];
static unsigned int k0=0;
static unsigned int k1=0;
static unsigned int k30=0;   /* would be (L_{31}(k0) shr 1) ^ L_{30}(k0). */

static void init(unsigned char * pseed)
{
    unsigned int seed;
    N2L(pseed, seed);

    key0[0] =
            (((~seed) ^ 0x00001357) << 16)
        |   ((seed ^ 0xffffaaaa) & 0x0000ffff);
    key1[0] =
            ((seed ^ 0x43210000) >> 16)
        |   (((~seed) ^ 0xabcdffff) & 0xffff0000);
}

static void crypt(unsigned char *buff, int len)
{
   int i = 0;
   int m_key0 = key0[0];
   int m_key1 = key1[0];
   unsigned int table0 = 0, table1 = 0;

    for(i = 0; i < len; i++)
    {
        buff[i] = buff[i] ^ (unsigned char)m_key0;

        table0 = m_key0;
        table1 = m_key1;

      m_key0 = ((table0 >> 1) | (table1 << 31)) ^ k1;
       table1 = ((table1 >> 1) | (table0 << 31));
       m_key1 = ((table1 >> 1) | (table0 << 31)) ^ k30;
    }

   return;
}

/* low a bits of b */
#define L(a,b) ((b) & (((__int64)1<<((a)+1))-1))
/* a-st bit of b */
#define B(a,b) (((b) >> (a)) & 1)


/*
* everything goes from these formulas:
* key1[n+1] = ((( ((key1[n]>>1) ^ (key0[n]<<31)) ^ k0)>>1 )) ^ (key0[n]<<31) ) ^ k0;
* key0[n+1] = ((key0[n]>>1) ^ (key1[n]<<31)) ^ k1;
*/
int CalculateKeys(unsigned char Plaintext[62], unsigned char Ciphertext[62], unsigned int *LoginSeed,
              unsigned int *ClientLoginKey1, unsigned int *ClientLoginKey2)
{
   int i = 0, t = 0, n = 0;

   /* clean the vars */
   memset(key0, 0, sizeof(key0));
   memset(key1, 0, sizeof(key1));
   k0 = k1 = k30 = 0;

   /* fill key0[] array with known bits: */
   for(i = 0; i < SIZE; i++)
      key0[i] = Plaintext[i] ^ Ciphertext[i];

   /* calculate key0[0] & key1[0] */
   init((unsigned char*)LoginSeed);

   /* Get first 8 bits of k1: */
   k1 = B(8, (key0[1] ^ ((key0[0]>>1) | (key1[0]<<31))));

   /*
   * use formula to calculate remaining bits of k1/key0[n]:
   * L_{t+1}(key0[n]) = ((L_t(key0[n+1])^L_t(k1)) shl 1) | B_0(key0[n]);
   */
   for(t = 7; t < 32; t++)
   {
      for(n = 1; n < SIZE; n++)   
         key0[n] = L(t+1, ( ((L(t,key0[n+1]) ^ L(t,k1))<<1) ) | (B(0,key0[n])) );

      k1 = L(t+1, (key0[1] ^ ((key0[0]>>1) | (key1[0]<<31))) );
   }
   *ClientLoginKey2 = k1;

   /* CALCULATE k30 */
   /*
   * Calculate 1st bits of key1[n]:
   * B_0(key1[n]) = (key0[n+1]^k1) shr 31;
   */
   k30 = 0;
   for(n=1; n<SIZE; n++)
      key1[n] = B(31, key0[n+1] ^ k1 );

   /*
   * calculate remaining bits of key1:
   * B_t(key1[n+1]) = B_{t+2}(key1[n]) ^ B_t(k30)
   * B_{t+2}(key1[n]) = B_t(key1[n+1]) ^ B_t(k30)
   * B_t(k30) = B_{t+2}(key1[n]) ^ B_t(key1[n+1])
   */
   k30=0;
   for(t = 0; t < 30; t+=2)   
   {
      k30 |= (B(t+2, key1[0]) ^ B(t, key1[1])) << t;

      /* calculate t+2 bits */
      for(n = 1; n < SIZE; n++)
         key1[n] |= (B(t, key1[n+1]) ^ B(t, k30)) << (t+2);
   }

   /*
   * B_31(key1[n+1])=B_30(key1[n+1])
   * key1[1]|=B(30,key1[1])<<31;
   */

   /* get 31st bit of k. By the way, it is == bit 30 */
   k30 |= (B(30, key1[1]) ^ L(1,key0[0])) << 31;

   /* encrypt and see if it worked */
   *ClientLoginKey1 = k30;
   crypt(Plaintext, SIZE);
   if(memcmp(Ciphertext, Plaintext, SIZE) != 0)
      return -1; /* if not, oops */

   return 1;
}



Функция CalculateKeys написаная на си отвечает за доставание 2 ключей из масива для дальнейшей расшифровки пакетов ultima online. Плиз переведите етот код на родной VB или хотябы обясните что ето за корявый синтаксис "^","<<",">>","~","|" ? ...

Fisher
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 06.11.2005 (Вс) 13:12

Сообщение Fisher » 06.11.2005 (Вс) 16:28

Стукнуло же тому Бреду Питу (или как там его) создать такой корявый язык (кстати он вроде на Делфи сам пишет) ... На вб етот код выглядил бы в 3 раза меньше и проще ...
Может кто-то всётаки знаком с си ?

Zoomie
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 181
Зарегистрирован: 10.05.2004 (Пн) 10:07
Откуда: СПб

Сообщение Zoomie » 06.11.2005 (Вс) 16:37

А для не знакомых с Си, можешь объяснить принцип действия функции поподробнее?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 06.11.2005 (Вс) 16:43

"Корявый синтаксис"? Читаем книги по c++.
В интернете полно.

Fisher
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 06.11.2005 (Вс) 13:12

Сообщение Fisher » 06.11.2005 (Вс) 16:44

Zoomie писал(а):А для не знакомых с Си, можешь объяснить принцип действия функции поподробнее?

int CalculateKeys(BYTE Plaintext[62], BYTE Ciphertext[62], unsigned int *LoginSeed, unsigned int *ClientLoginKey1, unsigned int *ClientLoginKey2)

BYTE Plaintext[62] – Contains the non-encrypted look of the Ciphertext
BYTE Ciphertext[62] – Contains the encrypted data
unsigned int *LoginSeed – Contains the seed
unsigned int *ClientLoginKey1 – Receives the login key 1
unsigned int *ClientLogin Key2 – Receives the login key 2

Calculates the login keys using the Ciphertext buffer for the crypt math. Returns 1 on success, -1 on failure. The values are passed to ClientLoginKey1 and ClientLoginKey2 independent of the function succeeding or not.
Последний раз редактировалось Fisher 06.11.2005 (Вс) 16:49, всего редактировалось 1 раз.

Fisher
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 06.11.2005 (Вс) 13:12

Сообщение Fisher » 06.11.2005 (Вс) 16:47

Amed писал(а):"Корявый синтаксис"? Читаем книги по c++.
В интернете полно.


Так книг то много, но math примеров нет (точнее может и есть но проще уже выучить сам си).

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 06.11.2005 (Вс) 17:47

FleX_2004 писал(а):если не ошибаюсь Шапка аля "^" - это указатель на внутренний элемент; << - это либо "много меньше" - из математики или по аналогу cin<< и cout>> ... а вооще я в си не очень разбираюсь... :(

Судя по всему, соовершенно не разбераешься :)
Крышка ^ это исключающее ИЛИ, << и >> это операции побитового смещение, никакой аналогии с cout и cin нету, там это просто перегруженные операторы.
~ - побитовое отрицание, | - ИЛИ.

И вообще, переводить такой код - муторное и неблгаодарное дело. Если хочешь, что бы кто-то сделал это для тебе, придеться платить WMR...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.11.2005 (Вс) 17:57

Fisher писал(а):Стукнуло же тому Бреду Питу (или как там его) создать такой корявый язык (кстати он вроде на Делфи сам пишет) ... На вб етот код выглядил бы в 3 раза меньше и проще ...
Может кто-то всётаки знаком с си ?

Это так опустили Кернигана с Ричи? :-D
Изображение

Fisher
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 06.11.2005 (Вс) 13:12

Сообщение Fisher » 06.11.2005 (Вс) 20:13

ANDLL писал(а):Крышка ^ это исключающее ИЛИ

Плиз обясни на примере чему будет равнятся a=seed ^ 0xffffaaaa если сид=0х0ABC10Af например... не могу понять причём и где здесь исключающее или.


ANDLL писал(а):<< и >> это операции побитового смещение

0x43210000 >> 16 ето я так понял 16 раз будет менятся 0111001001 на 1000110110 и тому подобное ?? бред какойто и хер знает какое число выйдет.
Можна если не сложно пример не большой :cry: Ато я не вчехлил что такое побитовое смещение.



ANDLL писал(а):~ - побитовое отрицание

Тоже самое ... Какое отрицание ? отрицание чего ?
Можно примерчик :?

ANDLL писал(а):| - ИЛИ


Вот теперь не понятна например ета строка m_key1 = ((table1 >> 1) | (table0 << 31)) ^ k30; . Ето получается m_key1 = ((table1 >> 1) ИЛИ (table0 << 31)) ^ k30; что тоже бред ... Где проверка для ИЛИ?

Fisher
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 06.11.2005 (Вс) 13:12

Сообщение Fisher » 06.11.2005 (Вс) 20:19

tyomitch писал(а):
Fisher писал(а):Стукнуло же тому Бреду Питу (или как там его) создать такой корявый язык (кстати он вроде на Делфи сам пишет) ... На вб етот код выглядил бы в 3 раза меньше и проще ...
Может кто-то всётаки знаком с си ?

Это так опустили Кернигана с Ричи? :-D

Да ... гдето на Краклабсе читал.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 06.11.2005 (Вс) 20:31

Бинарные операции
& - "И"
Код: Выделить всё
A B | A&B
----+-----
0 0 |  0
0 1 |  0
1 0 |  0
1 1 |  1

| - "ИЛИ"
Код: Выделить всё
A B | A|B
----+-----
0 0 |  0
0 1 |  1
1 0 |  1
1 1 |  1

~ - "NOT"
Код: Выделить всё
A | ~A
--+----
0 |  1
1 |  0

^ - "Исключающее ИЛИ"
Код: Выделить всё
A B | A^B
----+-----
0 0 |  1
0 1 |  0
1 0 |  0
1 1 |  1

<< - "Сдвиг влево"
Код: Выделить всё
   0001
<< 0010
<< 0100

>> - "Сдвиг вправо"
Код: Выделить всё
   1000
>> 0100
>> 0010

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 06.11.2005 (Вс) 20:41

1)F543BA05
2)101010>>1=010101
010101>>1=001010
010101<<1=101010
То, что ты написал это побитовое вращение.
3)~101=010
4)101|000=101, 1001|0101=1101
Теперь касательно каждого в отдельности: все эти операции ПОБИТОВЫЕ. Т.е. операция ИЛИ, И, НЕ проводиться над каждым битом в отдельности.
А побитовое смещение аналогично делению или умножению на 2, т.е. X>>n={x разделить на 2 в степени n}.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

pitbull
Постоялец
Постоялец
 
Сообщения: 314
Зарегистрирован: 25.06.2004 (Пт) 15:37
Откуда: Кемерово

Сообщение pitbull » 06.11.2005 (Вс) 21:05

Fisher
Ты лучше попроси чтобы тебе откомпилили это в виде DLL на си, которую можно юзать на VB...
И никаких проблем с "корявыми причудами языка. Брэда Пита" :D :D :D

Fisher
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 06.11.2005 (Вс) 13:12

Сообщение Fisher » 06.11.2005 (Вс) 21:24

Так дллка уже есть но я не могу никак подобрать правильно тайпы (Bad dll calling convention и + сверху vb повис) ... Бросил и решил сам зделать свой класс модуль.
Код: Выделить всё
APIs





int CalculateKeys(BYTE Plaintext[62], BYTE Ciphertext[62], unsigned int *LoginSeed, unsigned int *ClientLoginKey1, unsigned int *ClientLoginKey2)





BYTE Plaintext[62] – Contains the non-encrypted look of the Ciphertext

BYTE Ciphertext[62] – Contains the encrypted data

unsigned int *LoginSeed – Contains the seed

unsigned int *ClientLoginKey1 – Receives the login key 1

unsigned int *ClientLogin Key2 – Receives the login key 2



            Calculates the login keys using the Ciphertext buffer for the crypt math. Returns 1 on success, -1 on failure. The values are passed to ClientLoginKey1 and ClientLoginKey2 independent of the function succeeding or not.





void LoginCryptInit(LoginCryptObj *obj)



LoginCryptObj *Obj – A pointer to a LoginCryptObj structure



            Initializes the crypt info of the ‘obj’ structure. The pseed value of the structure must be declared. Has to be called before calling the LoginCryptEncrypt.





void LoginCryptEncrypt(LoginCryptObj *obj, unsigned char *in, unsigned char *out, int len)



LoginCryptObj *Obj – A pointer to a LoginCryptObj structure

unsigned char *in – A pointer to a buffer with the data to be encrypted

unsigned char *out – A pointer to a buffer to dump the encrypted data

int len – The amount of bytes in the ‘in’ buffer to be encrypted



            Encrypts and decrypts login packets. Uses the encryption method used in clients greater than 1.25.36. The ‘out’ buffer must be of the same size or greater than ‘len’





юзал так ...

Код: Выделить всё
в модуле

Declare Function CalculateKeys Lib "f:\uo\inj\IRW\UOEncryption.dll" (Plaintext() As Byte, Ciphertext() As Byte, LoginSeed As String, ClientLoginKey1 As Long, ClientLoginKey2 As Long) As Integer
Declare Function BlowfishEncrypt Lib "D:\uo\inj\IRW\UOEncryption.dll" (Plaintext() As Byte, Ciphertext() As Byte, LoginSeed As Long, ByVal ClientLoginKey1 As Long, ByVal ClientLoginKey2 As Long) As Integer

Declare Function LoginCryptInit Lib "f:\uo\inj\IRW\UOEncryption.dll" (lllol As LoginCryptObj) As Integer

Type LoginCryptObj
    pseed As Long
    k1 As Long
    k2 As Long
    m_key(2) As Long
    m_k2 As Long
    m_k1 As Long
End Type




В форме




Dim seed As String
Dim key() As Byte
Dim key222() As Byte
Dim key1 As Long
Dim key2 As Long
Private Sub Command1_Click()
seed = &H1C0AA8C0
a = CalculateKeys(key222(), key(), seed, key1, key2)
End Sub



Private Sub Command2_Click()
Dim lllol As LoginCryptObj

a = LoginCryptInit(lllol)

End Sub

Private Sub Form_Load()
Dim lllol As LoginCryptObj

ReDim Preserve key(64)
key(0) = 192 'C0 or À
key(1) = 168 'A8 or ¨
key(2) = 10 'A or
key(3) = 28 '1C or 
key(4) = 128 '80 or €
key(5) = 104 '68 or h
key(6) = 114 '72 or r
key(7) = 101 '65 or e
key(8) = 110 '6E or n
key(9) = 100 '64 or d
key(10) = 101 '65 or e
key(11) = 108 '6C or l
key(12) = 0 '0 or
key(13) = 0 '0 or
key(14) = 0 '0 or
key(15) = 0 '0 or
key(16) = 0 '0 or
key(17) = 0 '0 or
key(18) = 0 '0 or
key(19) = 0 '0 or
key(20) = 0 '0 or
key(21) = 0 '0 or
key(22) = 0 '0 or
key(23) = 0 '0 or
key(24) = 0 '0 or
key(25) = 0 '0 or
key(26) = 0 '0 or
key(27) = 0 '0 or
key(28) = 0 '0 or
key(29) = 0 '0 or
key(30) = 0 '0 or
key(31) = 0 '0 or
key(32) = 0 '0 or
key(33) = 0 '0 or
key(34) = 0 '0 or
key(35) = 55 '37 or 7
key(36) = 51 '33 or 3
key(37) = 55 '37 or 7
key(38) = 51 '33 or 3
key(39) = 57 '39 or 9
key(40) = 54 '36 or 6
key(41) = 50 '32 or 2
key(42) = 52 '34 or 4
key(43) = 48 '30 or 0
key(44) = 50 '32 or 2
key(45) = 51 '33 or 3
key(46) = 0 '0 or
key(47) = 0 '0 or
key(48) = 0 '0 or
key(49) = 0 '0 or
key(50) = 0 '0 or
key(51) = 0 '0 or
key(52) = 0 '0 or
key(53) = 0 '0 or
key(54) = 0 '0 or
key(55) = 0 '0 or
key(56) = 0 '0 or
key(57) = 0 '0 or
key(58) = 0 '0 or
key(59) = 0 '0 or
key(60) = 0 '0 or
key(61) = 0 '0 or
key(62) = 0 '0 or
key(63) = 0 '0 or
key(64) = 93 '5D or ]

End Sub


Что не так ?

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 06.11.2005 (Вс) 21:56

^ - "Исключающее ИЛИ"

Код:
A B | A^B
----+-----
0 0 | 1
0 1 | 0
1 0 | 0
1 1 | 1

Может так?
Код:
A B | A^B
----+-----
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 0

Или я не прав и XOR(vb) не равно ^(c++) ?
Получается с точностью до наоборот...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 06.11.2005 (Вс) 21:59

GAGArin, ты прав.
Если конечно мое скромное мнение кого-то волнует....
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Fisher
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 06.11.2005 (Вс) 13:12

Сообщение Fisher » 06.11.2005 (Вс) 22:13

GAGArin писал(а):^ - "Исключающее ИЛИ"
Или я не прав и XOR(vb) не равно ^(c++) ?


А можна ещё таких ксоров только на другие случаи ? :? Ато я про такие функции побитовых вычеслений впервые слышу и в учебниках 0.

Чё впрям как в ассемблере ? фантастика.

Код: Выделить всё
   AND                  1              1             1
                        1              0             0
                        0              1             0
                        0              0             0   
----------------------------------------------------------------------------------------------
   OR                   1              1             1
                        1              0             1
                        0              1             1
                        0              0             0   
-----------------------------------------------------------------------------------------------
   XOR                  1              1             0
                        1              0             1

                        0              1             1
                        0              0             0 
-----------------------------------------------------------------------------------------------
   NOT                  0             N/A            1
                        1             N/A            0


Последний раз редактировалось Fisher 06.11.2005 (Вс) 22:56, всего редактировалось 1 раз.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.11.2005 (Вс) 22:39

Fisher, впрям.
Все двоичные компьютеры устроены одинаково :-)
Изображение

Fisher
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 06.11.2005 (Вс) 13:12

Сообщение Fisher » 06.11.2005 (Вс) 22:44

Бла ... а я уже начал писать свою функция преобразования в биты и хернячить их по тем таблицам ...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.11.2005 (Вс) 22:56

Fisher, выбрасывай свои функции и читай учебники по VB ;-)
Все побитовые операции, кроме сдвигов, в VB уже есть.
Сдвиги легко моделируются умножением и делением на степени двойки.
Изображение

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 06.11.2005 (Вс) 23:03

На самом деле пресловутый A xor B Это (A or B) and (not(A and B))
Так что писать его отдельно не обязательно.

На самом деле для построения любых таблиц достаточно двух операций:
not(A and B) и A or B
Все остальное выводится из них.


А еще на самом деле по моему пошел офтопик.

Fisher
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 06.11.2005 (Вс) 13:12

Сообщение Fisher » 06.11.2005 (Вс) 23:05

tyomitch писал(а):Fisher, выбрасывай свои функции и читай учебники по VB ;-)
Все побитовые операции, кроме сдвигов, в VB уже есть.
Сдвиги легко моделируются умножением и делением на степени двойки.

Слава богу что хоть всё прояснилось :) щас буду переводить на нормальный язык :) сенк всем кто помог :oops:
Кста. может у кого-то есть супер модный учебник ? именной и козырный какойто ? ато все которые мне встречались были без ксоров оров ендов, пуш еаексов :) .

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 06.11.2005 (Вс) 23:24

Сплюнь три раза! Нету таких! :)

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 06.11.2005 (Вс) 23:24

Зачем тогда вообще vb?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.11.2005 (Вс) 23:30

GAGArin писал(а):На самом деле для построения любых таблиц достаточно двух операций:
not(A and B) и A or B
Все остальное выводится из них.


А еще на самом деле по моему пошел офтопик.

На самом деле, для построения любых таблиц достаточно одной операции:
not(A and B) (т.н. "штрих Шеффера")
либо
not(A or B) (т.н. "стрелка Пирса")
Мы на курсе ДМ, как упражнение, выводили из каждой из них все остальные.
Изображение

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 07.11.2005 (Пн) 0:09

GAGArin писал(а):Получается с точностью до наоборот...

:oops: Попутал пока эти таблички рисовал.

Fisher
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 06.11.2005 (Вс) 13:12

Сообщение Fisher » 07.11.2005 (Пн) 11:15

Плиз поправте если шо ...

key0[0] = (((~seed) ^ 0x00001357) << 16) | ((seed ^ 0xffffaaaa) & 0x0000ffff);

Ето тоже самое что

key0(0) = ((Not (seed) Xor &H1357) * (Exp(16 * Log(2)))) Or ((seed Xor &HFFFFAAAA) And &HFFFF)

???

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 07.11.2005 (Пн) 11:18

tyomitch, круто! Не знал про штрих и стрелку, действительно, все выводится :)

А что такое ДМ?
Быть... или не быть. Вот. В чём вопрос?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.11.2005 (Пн) 12:01

Fisher писал(а):Плиз поправте если шо ...

key0[0] = (((~seed) ^ 0x00001357) << 16) | ((seed ^ 0xffffaaaa) & 0x0000ffff);

Ето тоже самое что

key0(0) = ((Not (seed) Xor &H1357) * (Exp(16 * Log(2)))) Or ((seed Xor &HFFFFAAAA) And &HFFFF)

???

Это то же самое, что
key0(0) = (((Not seed) Xor &H1357) * 65536) Or ((seed Xor &HFFFFAAAA) And &HFFFF)


ДМ = дискретная математика.
Изображение

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 22

    TopList