GetSteamAccountID

JDW

Мы открываем бизнес
Сообщения
376
Реакции
325
Добрый вечер! Хотел бы узнать алгоритм работы функции
GetSteamAccountID

В интернете искал и в сорцах тоже, реализации не увидел(

Пример:

Есть ID пользователя [U:1:923344368], берем следующую часть 923344368, она укладывается в 4 байта(значит преобразовывать не надо), а если взять к примеру: [U:1:3058923730] (3058923730), то число уже выходит за рамки в 4 байта. Функция GetSteamAccountID преобразовывает 3058923730 в следующий вид: -1236043566. Кто сможет объяснить и показать пример работы данного алгоритма ?
 
Последнее редактирование модератором:

komashchenko

Идиот
Сообщения
916
Реакции
2,570
GetSteamAccountID возвращает uint32 у него диапазон 0 - 4294967295
 

JDW

Мы открываем бизнес
Сообщения
376
Реакции
325
Для [U:1:923344368] => STEAM_0:0:461672184
Для [U:1:3058923730] =>STEAM_0:0:1529461865
 

Islam Cherkess

Там мля о мля
Сообщения
1,504
Реакции
895
или может
стимточкаком/id/айди/
и да,пожалуйста пишите чуть более мельче просто глаза режет:)
 

komashchenko

Идиот
Сообщения
916
Реакции
2,570
У павна нет uint, ты рассматриваешь его как int, а там 31 бит показывает что это число минус
 
Последнее редактирование:

JDW

Мы открываем бизнес
Сообщения
376
Реакции
325
Тогда возможно, в плагине VIP CORE идет преобразование
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,927
  • Команда форума
  • #9
@bat9xxx, не идёт там ничего.
Там используется всё тот же GetSteamAccountID() без каких-либо изменений.
 

JDW

Мы открываем бизнес
Сообщения
376
Реакции
325
@bat9xxx, не идёт там ничего.
Там используется всё тот же GetSteamAccountID() без каких-либо изменений.
Уже это я понял. Тогда остается вопрос: При добавление VIP пользователя в бд с ID, который не выходит за границы 4-х байт, то добавляется без изменения, а если ID выходит за границы, то оно преобразовывается в id отрицательного значения.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,927
  • Команда форума
  • #11
выходит за границы
Такого быть не может. У Вас Павн максимально 4 байта и тянет. Вы никак в базу загнать что-то больше 4 байт под видом обычного инта не сможете, только если этот Инт случайно не в виде строки (последовательности символов) хранится.

Последний бит и решает, каким станет числом: положительным или отрицательным. Это Вам хотел сказать @komashchenko. В то время, когда сама функция получения AccountID возвращает неподписанное число, в котором понятия отрицательности вообще нет, Павн его получает как подписанное. Потому такое и случается. Хотя если бинарно смотреть на число - то все ок.
Можете попробовать бинарно в базу передать.
PHP:
FormatEx(szBuffer, sizeof(szBuffer), "0b%b", iAccountID);
Если колонка помечена как только положительная - получите нормальное число.
 
  • Мне нравится
Реакции: JDW

JDW

Мы открываем бизнес
Сообщения
376
Реакции
325
Такого быть не может. У Вас Павн максимально 4 байта и тянет. Вы никак в базу загнать что-то больше 4 байт под видом обычного инта не сможете, только если этот Инт случайно не в виде строки (последовательности символов) хранится.

Последний бит и решает, каким станет числом: положительным или отрицательным. Это Вам хотел сказать @komashchenko. В то время, когда сама функция получения AccountID возвращает неподписанное число, в котором понятия отрицательности вообще нет, Павн его получает как подписанное. Потому такое и случается. Хотя если бинарно смотреть на число - то все ок.
Можете попробовать бинарно в базу передать.
PHP:
FormatEx(szBuffer, sizeof(szBuffer), "0b%b", iAccountID);
Если колонка помечена как только положительная - получите нормальное число.
спасибо, проблема была решена, сделал правки в vip core под себя, теперь нормально все в бд сохраняется. Попробую еще вариант, который вы предложили
 

Nekro

Терра инкогнита
Сообщения
4,077
Реакции
2,347
А каким образом преобразованный стим GetSteamAccountID из такого -1847445316 вида можно преобразовать обратно в стим2 ?
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
А каким образом преобразованный стим GetSteamAccountID из такого -1847445316 вида можно преобразовать обратно в стим2 ?
Инфа по представлениям есть здесь: https://developer.valvesoftware.com/wiki/SteamID

Если совершенно нет представления, как это работает, то используйте строковый тип для хранения/получения идентификаторов.
 

Nekro

Терра инкогнита
Сообщения
4,077
Реакции
2,347
Инфа по представлениям есть здесь: SteamID - Valve Developer Community

Если совершенно нет представления, как это работает, то используйте строковый тип для хранения/получения идентификаторов.
Дошли руки, посмотрел и понял что ничего не понял)
Интернеты выдали несколько интересных ссылок:
1. php библиотека для конвертации steamid
Где идут преобразования 5 форматов:
а) стим64
б) стим2
в) стим3
г) ссылка на профиль формата profiles/name
д) ссылка на профиль формата id/123
2. GitHub - B3none/steam-id-converter: A steam ID converter
3. Тема на форуме GetSteamAccountID vs GetClientAuthId - AlliedModders
Но никаких способов преобразования этой самой основы GetSteamAccountID в какой либо из читабельных форматов стима выше
Может у кого есть рабочие варианты? Тащу GetSteamAccountID с базы vip core, так что нужен именно такой способ (мнеб именно на php)

В vip core нашёл вот такое

C++:
void UTIL_GetSteamIDFromAccountID(int iAccountID, char[] szSteamID, int iMaxLen)
{
    switch(g_EngineVersion)
    {
        case Engine_CSS, Engine_TF2, Engine_HL2DM, Engine_SourceSDK2007, Engine_BlackMesa:
        {
            FormatEx(szSteamID, iMaxLen, "[U:1:%u]", iAccountID);
        }
        default:
        {
            int iPart = iAccountID % 2;
            iAccountID -= iPart;
            FormatEx(szSteamID, iMaxLen, "STEAM_%d:%d:%d", g_EngineVersion == Engine_CSGO ? 1 : 0, iPart, iAccountID/2);
        }
       
    }
}

Если кому надо

PHP:
    $iPart = $iAccountID % 2;
    $iAccountID -= $iPart;
    $iAcc = $iAccountID/2;
    $steam2 = 'STEAM_0:'.$iPart.':'.$iAcc;
 
Последнее редактирование:
Сверху Снизу