|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 06.07.06 02:57. Заголовок: Сжатые числа
Помогите плс разобраться. Есть PRG-модуль позволяющий сжимать числа. Что под этим понимается я не знаю, возможно сжатие в двоично-десятичные числа, используемые в ассемблере, но судя по беглому осмотру кода, что-то большее. С клиппером никогда не имел дело, поэтому используемые в коде функции не всегда понятны, а разбираться времени нет. : ( Мне нужно знать что делает этот алгоритм, т.е. каким образом он пакует, чтоб написать аналогичное на другом языке. Ниже кусочек кода файла, может кому покажется знакомым - могу выслать весь файл. Средств отладки у меня нет. STATIC aTabl1 := { 29, 7, 15, 14, 23 } // 3 - 5_1 O5_1 STATIC aTabl2 := { 5, 21, 12, 30, 26 } // 16 - 5_2 O5_2 STATIC aTabl3 := { 8, 24, 17, 13 } // 10 - 4_1 O4_1 STATIC aTabl4 := { 4, 11, 9, 22 } // 25 - 4_2 O4_2 STATIC aTabl5 := { 20, 1, 18, 27 } // 19 - 4_3 O4_3 STATIC aTabl6 := { 2, 6, 28 } // 19 - 3_1 O3_1 STATIC aTabl7 := { 23, 21, 13, 9, 6 } STATIC aTabl8 := { 7, 12, 11, 22, 28 } STATIC aTabl9 := { 29, 30, 24, 1 } STATIC aTabl10 := { 15, 14, 20, 2 } STATIC aTabl11 := { 5, 26, 8, 17 } STATIC aTabl12 := { 4, 18, 27 } STATIC aTabl01 := { 1, 2, 4, 5, 7 } STATIC aTabl02 := { 3, 6, 8, 10 } // упаковка полей C 5 FUNCTION PackC5( Data ) MEMVAR pnKey LOCAL nRandVal, nKey := 0, nSavData IF pnKey = 3487595928158456 IF Data < 0 .OR. Data > 16777215 .OR. Data = 2105376 Data := 0 ENDIF nKey := RANDOM()%65535+1 nSavData := Data ChBits( @nKey, @Data, 3 ) IF nKey = 8224 .OR. nKey = 0 nKey := 0 Data := nSavData ELSE nRandVal := INT(RAND(nKey*(34*nKey+845)+196)*1000000) Data := NUMXOR( Data, nRandVal ) ENDIF ENDIF RETURN SUBSTR(L2BIN(Data),1,3)+I2BIN(nKey)
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 07.07.06 04:05. Заголовок: Re:
Pasha я тоже так думаю : ( fredi Там тоже генератор случайных чисел. FUNCTION UnPackC5( Data ) MEMVAR pnKey LOCAL nRandVal, nKey IF pnKey = 3487595928158456 nKey := BIN2W(SUBSTR(Data,4,2)) Data := BIN2L(SUBSTR(Data,1,3)+CHR(0)) IF nKey = 8224 .OR. nKey = 0 RETURN IIF(Data=2105376,0,Data) ELSE nRandVal := INT(RAND(nKey*(34*nKey+845) + 196)*1000000) Data := NUMXOR( Data, nRandVal ) ChBits( @nKey, @Data, 3 ) ENDIF ENDIF RETURN Data
|