Преобразование Steam ID пользователя из консоли в 64-битную версию в C # - PullRequest
0 голосов
/ 06 марта 2019

Я создаю приложение, в котором кто-то может вставить идентификатор пользователя Steam в поле поиска.В большинстве случаев это будет steam ID из игровой консоли, который выглядит следующим образом: STEAM_1:0:12345678.Мне нужно взять это и преобразовать в 64-битную версию, чтобы отправлять запросы в Steam API для этого пользователя.

Здесь много полезной информации: https://developer.valvesoftware.com/wiki/SteamID

НоЯ до сих пор не могу понять, как сделать преобразование в 64-битную.

Ответы [ 2 ]

5 голосов
/ 06 марта 2019

Это твой счастливый день; Я написал все это для вас. Обычно мы ожидаем увидеть некоторые усилия в вашей собственной реализации в первую очередь, даже если это будет грубо, и мы поможем вам исправить проблемы с этим кодом.

public static Int64 TranslateSteamID(string steamID)
{
    Int64 result = 0;

    var template = new Regex(@"STEAM_(\d):([0-1]):(\d+)");
    var matches = template.Matches(steamID);
    if (matches.Count <= 0) return 0;
    var parts = matches[0].Groups;
    if (parts.Count != 4) return 0;

    Int64 x = Int64.Parse(parts[1].Value) << 24;
    Int64 y = Int64.Parse(parts[2].Value);
    Int64 z = Int64.Parse(parts[3].Value) << 1;

    result =  ((1 + (1 << 20) + x) << 32) | (y + z);        
    return result;
}

По крайней мере, это работает для значения образца на связанной странице. Вы можете попробовать это здесь:

https://dotnetfiddle.net/Ejrqcw

0 голосов
/ 08 марта 2019

После дальнейших исследований и попыток следовать точной документации Steam Id вот решение, которое я придумал:

STEAM_X: Y: Z

Формула из документации: W = Z * 2 + V + Y

Используя STEAM_1: 1: 66138017 в качестве примера:

var steamId = "STEAM_1:1:66138017";
var match = Regex.Match(steamId, @"^STEAM_[0-5]:[01]:\d+$", RegexOptions.IgnoreCase);

if (!match.Success)
{
    return null;
}

// Split it into 3 parts using ":"
var split = steamId.Split(":");

var v = 76561197960265728;
var y = long.Parse(split[1]);
var z = long.Parse(split[2]);

var w = (z * 2) + v + y;

return w;

Объяснение того, откуда взялся V:

В документации есть таблица, в которой перечислены все типы аккаунтов Steam. Наиболее распространенный тип учетной записи - Индивидуальный. Таблица показывает, что шестнадцатеричное значение для этого 0x0110000100000000. Используя шестнадцатеричный в десятичный преобразователь я получил 76561197960265728.

...