#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<
}
По крайней мере, это работает для примерного значения на связанной странице. Вы можете попробовать это здесь:
Комментарии:
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, это понятнее, чем десятичное число.