RegisterQueryFile и String Hash

Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Доброго времени суток, балуюсь с API Речекера, не могу понять одну вещь.
Я регистрирую файл с определенным хешем, по сути он строковый, так-как имеет буквы.

Но регистрацию строкового хеша мне разумеется не дает, выдает ошибку, так, а как я туда запихаю целочисленный хеш?

RegisterQueryFile( sFile, "handler_QueryFile", RES_TYPE_EXISTS, sHash );

error 035: argument type mismatch (argument 4)
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Alex1985, я знаю, что это за ошибка, вопрос в том, что туда я не запихаю строковый хеш )
18 Сен 2019
А так же и не получу строковый хеш, что бы сравнить его потом со своим )
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Регистрирую
RegisterQueryFile( "../config/rev_MasterServers.vdf", "handler_QueryFile", RES_TYPE_HASH_ANY );

Получаю

Код:
public handler_QueryFile( const client, const hash, const uniqueId )
{
    server_print("shash = %s ", Hash2Hex(hash) );
   
    server_print("hash = %d ", hash );
}

Hash2Hex(hash) {
    new result[9];
    for(new i = 0, mask, bit, k; i < 32; i+= 4) {
        mask = (1 << i) | (1 << (i+1)) | (1 << (i+2)) | (1 << (i+3));
        bit = (hash & mask) >> i;
        if (bit < 0) {
            bit &= 0xF;
        }
        k = 7 - (i / 4);
        result[k] = bit <= 9 ? bit + 48 : bit + 55;
    }
    result[8] = EOS;
    return result;
}
На выходе имею( неверный хеш )
sHash = CE75C523 / iHash = -831142621

Если брать плагин: https://dev-cs.ru/resources/367/
Тот там хукается RegisterHookChain(RC_CmdExec, "CmdExec", true); и файлы из resources.ini

И на выходе имею( верный хеш )
iHash = 600143310 / sHash =23C575CE.

Вопрос, че за фигня? =D
 

Garey

ninjaCow
Сообщения
422
Реакции
1,056
Помог
10 раз(а)
Почему данный хэш по вашему неверный?
sHash = CE75C523 / iHash = -831142621
Это хэш не из вашего листа а тот которой пришел от клиента.
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Garey, потому что зарегистрированный файл имеет другой хеш
 

Garey

ninjaCow
Сообщения
422
Реакции
1,056
Помог
10 раз(а)
Javekson видно вы sHash невнимательно посмотрели - посути просто порядок байтов другой. Одна из этих функция должна подойти (Вроде ByteToStringBE):
Код:
stock ByteToStringLE(hash)
{
    new result[9];
    format(result, charsmax(result), "%02X%02X%02X%02X", (hash) & 0xff, (hash >> 8) & 0xff, (hash >> 16) & 0xff, (hash >> 24) & 0xff);
    return result;
}
stock ByteToStringBE(hash)
{
    new result[9];
    format(result, charsmax(result), "%02X%02X%02X%02X", (hash >> 24) & 0xff, (hash >> 16) & 0xff, (hash >> 8) & 0xff, hash & 0xff);
    return result;
}
18 Сен 2019
обновил функции.
18 Сен 2019
Для обратного hex-string to int можете воспользоваться: https://forums.alliedmods.net/showpost.php?p=739674&postcount=3?p=739674&postcount=3
 
Последнее редактирование:
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Garey, большое спасибо, конечно это новое для меня, пригодится, но вопрос вот в чем.

Фай "../config/rev_MasterServers.vdf" по факту имеет хеш 23C575CE

Зарегистрировать в таком виде я его не могу, мне надо перевести его именно в -831142621

Ибо походу, по-другому не поймет, а hex-string to int дает мне 600143310

RegisterQueryFile( "../config/rev_MasterServers.vdf", "handler_QueryFile", RES_TYPE_HASH_ANY );

Почему думаю, что по-другому не поймет, ибо возвращает мне -831142621

Как я понял мне надо переделать hex-string to int, но как я увы не знаю.
18 Сен 2019
Регистрировать будe примерно так

RegisterQueryFile( sFile, "handler_QueryFile", RES_TYPE_EXISTS, iHash );
 
Сообщения
198
Реакции
16
Помог
1 раз(а)
если я тебя правильно понял, то вот
 

Garey

ninjaCow
Сообщения
422
Реакции
1,056
Помог
10 раз(а)
Javekson
Код:
stock hex2int(hex[], len, bool:swap=false) {
    new val = 0;
    for(new i = 0; i < len; i++)
    {
        // get current character then increment
        new byte = hex[i];
        // transform hex character to the 4bit equivalent number, using the ascii table indexes
        if (byte >= '0' && byte <= '9') byte = byte - '0';
        else if (byte >= 'a' && byte <='f') byte = byte - 'a' + 10;
        else if (byte >= 'A' && byte <='F') byte = byte - 'A' + 10;
        val = (val << 4) | (byte & 0xF);
    }
    if(swap)
    {
        val =     ((val & 0x000000ff ) << 24 ) |
                ((val & 0x0000ff00 ) <<  8 ) |
                ((val & 0x00ff0000 ) >>  8 ) |
                ((val & 0xff000000 ) >> 24 )
    }
    return val;
}
server_print("%d", hex2int("23C575CE", 8, true) )


Исправленный для PAWN сток hex2int из этой темы по ссылке ниже
 
Последнее редактирование модератором:

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу