Что нового

Помощь по переводу маленького кода С# на язык AutoIt

DjReactive

Новичок
Сообщения
17
Репутация
0
Здравствуйте, помогите пожалуйста перевести этот код, написанный на языке С# перевести на AutoIt. Либо помогите найти полезный учебник.

Что именно я не понял: ulong, uL, и "|=" и "<<=" что означают эти действия. Заранее спасибо.

Код:
public static string HexToString(byte[] HexString)
{
        string arg = "";
        string text = "0123456789ABCDEFGHJKLMNPRSTVWXYZ";
        for (int i = 0; i < 3; i++)
        {
                ulong num = 0uL;
                for (int j = 0; j < 5; j++)
                {
                        num <<= 8;
                        num |= (ulong)HexString[i * 5 + j];
                }
                for (int j = 0; j < 8; j++)
                {
                        ulong num2 = num >> j * 5 & 31uL;
                        char c = text[(int)num2];
                        arg += c;
                }
        }
        return arg;
}
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
А что делает эта функция? Возможно, уже есть готовый аналог... например
Код:
_HexToString()
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Можно вообще я думаю сделать dll с этой функцией и через DLLCall в AutoIt её вызывать...
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
C# вообще в глаза никогда не видел.
Классический C видел, когда был студентом (это более 20 лет назад)...
Но, по-моему, так

Код:
Func HexToString($argHexString)
	$HexString = StringSplit($argHexString,"",2)
	$arg = ""
    $text = StringSplit("0123456789ABCDEFGHJKLMNPRSTVWXYZ","",2)
    For $i = 0 To 2
		$num = 0
		For $j = 0 To 4
			$num *= 256
            $num += $HexString[$i*5 + $j]
		Next
		For $j = 0 To 7
			$num2 = Mod(Floor($num/($j*32)),32)
			$c = $text[$num2]
			$arg &= $c  ; хотя вот здесь сомневаюсь - может всё таки $arg += $c
		Next
	Next
	Return $arg
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
C2H5OH [?]
А как ей пользоваться? Ей какой параметр не передаёшь - всё ошибка
Код:
"C:\Users\Admin\Desktop\AutoIt v3 Script.au3" (9) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
$num += $HexString[$i*5 + $j]
$num += ^ ERROR
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Без понятия.
Я тупо взял и заменил все опреаторы AutoItовскими.
Судя по коду, чтобы не возникала ошибка, на входе должна быть строка не менее 15 символов.
А что делает данная функция для меня загадка. Потому как сначала идут сдвиги влево на 8 бит, а потом сдвиги вправо на $j * 5.
Наверное пытается какой-то id-ключ сгенерировать.


Добавлено:
Сообщение автоматически объединено:

Что-то не так с вот этой строкой
Код:
ulong num2 = num >> j * 5 & 31uL;
Код:
$num2 = Mod(Floor($num/($j*32)),32)

:scratch:
х.з. как там в C# определён приоритет операций.
 
Автор
D

DjReactive

Новичок
Сообщения
17
Репутация
0
C2H5OH сказал(а):
Наверное пытается какой-то id-ключ сгенерировать.

Да. это так. Она генерирует ключ для игры. Мне это необходимо для использования в лаунчере.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Что-то не так с вот этой строкой

Не, похоже с операциями я угадал, просто там получается 8-байтное число и AutoIt его не может обработать корректно.
Из-за этого вылазит ошибка в этой строке.

Первая часть легко - просто формируется строка из выборочных символов параметра (8 байт).
А во второй части это всё делится на куски по 5 бит.
Мне не охота с битами возиться. Если кому не лень, допилите. ;D
 
Автор
D

DjReactive

Новичок
Сообщения
17
Репутация
0
У меня лицензия игры, поэтому приведу примеры ключей:
XXXX-XXXXX-XXXXX-XXXXX-XXXXX

ну к примеру: W7GB-Z01WG-4S8B2-JF4K1-D5BGL

Но тире вставляются в другой функции в этих же местах (но это другая история), то есть по сути на выходе в функции (из 1ого сообщения) должно быть:
W7GBZ01WG4S8B2JF4K1D5BGL


Добавил вот один из ключей:
HexKey (бинарный ключ из регистра) - 04bb0630f6f6b9f13eeb4cc976b86b
Нормальный ключ: N7CC-GXJ0B-PF2ZW-TYB3E-DP4K9
 
Автор
D

DjReactive

Новичок
Сообщения
17
Репутация
0
madmasles, он генерирует случайный ключ, хорошо конечно)) но мне нужно чтобы он переводил hexkey в такой ключ (а сам код есть, но он на С#) вот я и хотел бы у вас попросить помочь его перевести на язык Autoit :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
DjReactive,
Если я правильно понял то, что написано здесь: Операторы в C и C++, то должно быть примерно так.
Код:
;~ 				    30 30                  30 29                 31 13
;~ 22 7 12 12 16 29 18 0  11 23 15 2 31 28 26 30 11 3 14 13 23 4 19 9

;~ 		 --      --      --
;~ N7CCGXJ0BPF2ZWTYB3EDP4K9
;~ N7CCGXYYBPF2ZWYXB3EDP4ZD
;~ 		 --      --      --
Local $s_Hex = '04bb0630f6f6b9f13eeb4cc976b86b'

Local $s_Chr = '0123456789ABCDEFGHJKLMNPRSTVWXYZ', $a_Hex, $a_Chr, $s_Str, $i_Num

$a_Hex = StringRegExp($s_Hex, '.{2}', 3)
$a_Chr = StringSplit($s_Chr, '', 2)
For $i = 0 To 2
	$i_Num = 0
	For $j = 0 To 4
		$i_Num = BitOR(BitShift($i_Num, -8), '0x' & $a_Hex[$i * 5 + $j])
	Next
	For $j = 0 To 7
;~ 		здесь не совпадают 6 и 7 цифры
		ConsoleWrite(BitAND(BitShift($i_Num, $j * 5), 31) & @LF)
		$s_Str &= $a_Chr[BitAND(BitShift($i_Num, $j * 5), 31)]
	Next
	ConsoleWrite('---' & @LF)
Next
ConsoleWrite($s_Str & @LF)
ConsoleWrite(StringRegExpReplace($s_Str, '(?=(.{5})+\z)', '-') & @LF)
Но почему то не совпадают две последние цифры(буквы) в каждом цикле For $j = 0 To 7. :scratch:
 
Автор
D

DjReactive

Новичок
Сообщения
17
Репутация
0
Жаль не на столько сильно еще понимаю AutoIt, но учусь..
Да, у тебя на выходе N7CC-GX**B-PF2**-**B3E-DP4** вроде не верно получилось. ща буду смотреть, может вникну.


Добавлено:
Сообщение автоматически объединено:

madmasles, Ну, что не понял почему так =)
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Начнем с того, что созданная на шарпе DLL в AutoIT работать не будет. ;)

Во вторых, косяки с генерацией происходят из-за ограничения AutoIT на битовые операции в 32 бита, а как мы видим в первоначальной функции используются 64 бита.

Bit operations are performed as 32-bit integers.

Что подтверждает вывод:
Код:
For $j = 0 To 4
        $i_Num = BitOR(BitShift($i_Num, -8), '0x' & $a_Hex[$i * 5 + $j])
		ConsoleWrite($i_Num & @LF)
    Next

Код:
4
1211
310022
79365680
-1157222154

А так, madmasles молодец, написал функцию правильно :smile:
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
alex33 сказал(а):
Как правило, на других ЯП DLL компилируются и (в основном) не зависят от других библиотек и к функциям можно обратиться непосредственно. В C# же используется псевдо-компиляция в CIL код (промежуточный язык), из которого вызвать никто ничего не может, кроме самой среды выполнения .NET. Поэтому ни программы, ни DLL не смогут работать без .NET на компьютере.

OffTopic:
Уф. Надеюсь ничего в теории и терминологии не напутал
 
Автор
D

DjReactive

Новичок
Сообщения
17
Репутация
0
косяки с генерацией происходят из-за ограничения AutoIT на битовые операции в 32 бита
А может ли эта функция, предложенная Yashied в теме http://autoit-script.ru/index.php?topic=328.0
Код:
ConsoleWrite(_Hex64(1067353106670363250) & @CR)

Func _Hex64($iValue, $iLenght = 16)

    Local $tStruct1, $tStruct2

    $tStruct1 = DllStructCreate('int64')
    DllStructSetData($tStruct1, 1, $iValue)
    $tStruct2 = DllStructCreate('int;int', DllStructGetPtr($tStruct1))
    Return StringRight(StringFormat('%016s', Hex(DllStructGetData($tStruct2, 2)) & Hex(DllStructGetData($tStruct2, 1))), $iLenght)
EndFunc   ;==>_Hex64


помочь в переводе кода на AutoIt???
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Вроде работает:
Код:
Global $ret = ''
For $i = 0 To 2
	Local $num = 0, $numH = 0
	For $j = 0 To 4
		$numH = BitOR(BitShift($numH, -8), BitShift($num, 8*3))
		$num = BitOR(BitShift($num, -8), BinaryMid('0x04bb0630f6f6b9f13eeb4cc976b86b', $i * 5 + $j + 1, 1))
	Next
	For $j = 0 To 5
		$ret &= StringMid("0123456789ABCDEFGHJKLMNPRSTVWXYZ", BitAND($num, 31)+1, 1)
		$num = BitShift($num, 5)
	Next
	$num = BitOR(BitAND($num, 3), BitShift($numH, -2))
	$ret &= StringMid("0123456789ABCDEFGHJKLMNPRSTVWXYZ", BitAND($num, 31)+1, 1)
	$num = BitShift($num, 5)
	$ret &= StringMid("0123456789ABCDEFGHJKLMNPRSTVWXYZ", BitAND($num, 31)+1, 1)

Next
ConsoleWrite($ret & @CRLF)
Хотя еще можно оптимизировать...
 
Автор
D

DjReactive

Новичок
Сообщения
17
Репутация
0
Z_Lenar, спасибо большое дружище))) выручил. Работает все прекрасно!
 
Верх