【问题标题】:Converting a users Steam ID from console to the 64bit version in C#在 C# 中将用户 Steam ID 从控制台转换为 64 位版本
【发布时间】:2019-03-06 17:54:56
【问题描述】:

我正在创建一个应用程序,有人可以在其中将用户的 Steam ID 粘贴到搜索框中。在大多数情况下,它将是来自游戏控制台的 Steam ID,如下所示:STEAM_1:0:12345678。我需要将其转换为 64 位版本,以便为该用户向 Steam API 发出请求。

这里有很多有用的信息: https://developer.valvesoftware.com/wiki/SteamID

但我仍然不知道如何转换为 64 位。

【问题讨论】:

  • 使用二元移位运算符,如<< 和/或>> 将各个 ID 组件移动到正确的位位置,并使用二元 OR 运算符 | 组合移位的组件。该文档可以告诉您有关这些运算符的更多信息。 (docs.microsoft.com/en-us/dotnet/csharp/language-reference/…)
  • @Rup,正确。你说的太对了。当然我的意思是二进制或|(在其他人发现这个可笑的错误之前匆忙编辑我的评论......);-)

标签: c# steam steam-web-api steamworks-api


【解决方案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 result;
}

它至少适用于链接页面上的示例值。你可以在这里试试:

https://dotnetfiddle.net/Ejrqcw

【讨论】:

  • 非常感谢您。转回另一个方向复杂吗?
  • 反过来做这些事情。
  • 最后一个问题。在我发布的链接中有一个标题为:Steam ID 作为 Steam 社区 ID。他们说简单地做 W=Z*2+V+Y。这意味着什么?
  • 这意味着一些,但我不确定“v”来自哪里。 z*2 部分有效,因为乘以 2 与将位移一位相同。
  • 是的,他们说你从该部分上方的表格中得到 V,我猜这没有任何意义。在大多数情况下,它可能是数字 1-9,但就公式而言,这不可能是正确的。
【解决方案2】:

经过进一步研究并尝试遵循确切的Steam Id documentation,这是我想出的解决方案:

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。使用hex to decimal converter 我最终得到了 76561197960265728。

【讨论】:

  • 你可以在你的代码中写0x0110000100000000,比十进制数字更清晰的IMO。
猜你喜欢
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 2011-01-31
相关资源
最近更新 更多