将用户Steam ID从控制台转换为C#中的64位版本

时间:2019-03-06 17:54:56

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

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

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

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

2 个答案:

答案 0 :(得分:5)

这是你的幸运日;我为你写了整件事。通常,我们希望您会首先在自己的实现中付出一些努力,即使这很艰难,我们也会帮助您解决该代码中的问题。

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

它至少适用于链接页面上的样本值。您可以在这里尝试:

  

enter image description here

答案 1 :(得分:0)

经过进一步研究并尝试遵循确切的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。