Преобразование идентификатора пользователя Steam с консоли в 64-разрядную версию на C#

#c# #steam #steam-web-api #steamworks-api

#c# #Steam #steam-web-api #steamworks-api

Вопрос:

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

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

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

Комментарии:

1. Используйте операторы двоичного сдвига, такие как << и / или >> , чтобы переместить отдельные компоненты идентификатора в правильные битовые позиции, и двоичный оператор OR | , чтобы объединить сдвинутые компоненты. Документация может рассказать вам больше об этих операторах. ( learn.microsoft.com/en-us/dotnet/csharp/language-reference /… )

2. @Rup, правильно. Вы совершенно правы. Конечно, я имел в виду двоичный файл ИЛИ | (поспешно редактирую свой комментарий, пока кто-нибудь еще не заметил эту нелепую ошибку …) 😉

Ответ №1:

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

 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 resu<
}
  

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

https://dotnetfiddle.net/Ejrqcw

Комментарии:

1. Большое вам за это спасибо. Сложно ли преобразовать обратно в другом направлении?

2. Выполните эти действия в обратном порядке.

3. последний вопрос. В ссылке, которую я разместил, есть раздел под названием: Steam ID как идентификатор сообщества Steam. Они говорят, что нужно просто сделать W = Z * 2 V Y. Означает ли это что-нибудь?

4. Это что-то значит, но я не уверен, откуда взялось «v». Часть z * 2 работает, потому что умножение на два — это то же самое, что сдвиг битов на одну позицию.

5. Да, они говорят, что вы получаете V из таблицы над разделом, что, я думаю, ничего не значит. В большинстве случаев это может быть номер 1-9 под номером 1, но это не может быть правильным, насколько позволяет формула.

Ответ №2:

После дальнейших исследований и попыток точно следовать документации 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.

Комментарии:

1. Вы можете написать 0x0110000100000000 в своем коде, и, IMO, это понятнее, чем десятичное число.