Quantcast

Jump to content

  • Log In with Steam Sign In
  • Create Account
119 players in 39 servers, 284 users online, 20 recent bans.

Recent Status Updates

  • Photo
      21 Nov
    FoxHound

    ⠰⡿⠿⠛⠛⠻⠿⣷ ⠀⠀⠀⠀⠀⠀⣀⣄⡀⠀⠀⠀⠀⢀⣀⣀⣤⣄⣀⡀ ⠀⠀⠀⠀⠀⢸⣿⣿⣷⠀⠀⠀⠀⠛⠛⣿⣿⣿⡛⠿⠷ ⠀⠀⠀⠀⠀⠘⠿⠿⠋⠀⠀⠀⠀⠀⠀⣿⣿⣿⠇ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠁ ⠀⠀⠀⠀⣿⣷⣄⠀⢶⣶⣷⣶⣶⣤⣀ ⠀⠀⠀⠀⣿⣿⣿⠀⠀⠀⠀⠀⠈⠙⠻⠗ ⠀⠀⠀⣰⣿⣿⣿⠀⠀⠀⠀⢀⣀⣠⣤⣴⣶⡄ ⠀⣠⣾⣿⣿⣿⣥⣶⣶⣿⣿⣿⣿⣿⠿⠿⠛⠃ ⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄ ⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡁ ⠈⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁ ⠀⠀⠛⢿⣿⣿⣿⣿⣿⣿⡿⠟ ⠀⠀⠀⠀⠀⠉⠉⠉

    Show comments (2)
View All Updates

Recent Topics


Featured Partners












Steamid C++ Class Source Code

- - - - -

  • Please log in to reply
1 reply to this topic

#1
Hydranix_

Hydranix_

    CS:S Moderator



  • 61 posts
  • Locationroot@127.0.0.1
Here's a SteamID C++ class I wrote to make handling SteamIDs extremely easy.

Constructed with from std::string of a Steam ID in either legacy (STEAM_0:1:xxxxxx) or ID3 (U:1:xxxxxx) format.

Can also be constructed from an 64 bit ID struct, aka the long number in steam community profile urls.

The class takes up only 4 bytes ( sizeof(uint32_t) ) of memory for each SteamID object.

operator== for equality checking against other SteamIDs
operator<< and operator>> for serialization (saving to file or database) and is human readable (std::cout)

SteamIDs constructed from any format can easily be converted with the id() id3() id_i32() and if_i64() functions.
The conversion is built on each function call making the object itself have a footprint of only 4 bytes since based on my observation, the account id (32bits) is the only meaningful part of a SteamID.

The Code:

Header
#pragma once
#include <string>
#include <vector>
#include <cstdint>

// For splitting strings
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems);
std::vector<std::string> split(const std::string &s, char delim);

// https://developer.valvesoftware.com/wiki/SteamID
// When representing a SteamID in a program you only need
//   32bits to hold the actual account ID. Although valve
//   says that a 64bit data struct is required, the upper
//   32 bits of that struct are always identical for every
//   SteamID
class SteamID {
public:
  // Default constructor for empty SteamID
  SteamID();
  // Construct from either SteamID or SteamID3
  SteamID(std::string &strSteamID);
  // Construct from SteadID64
  SteamID(uint64_t &_steamID64);
  // Construct copy
  SteamID(const SteamID& from);
~SteamID();
// serialization, for human readable output use id() or id3()
friend std::ostream& operator<<(std::ostream &os, const SteamID& s);
friend std::istream& operator>>(std::istream &is, SteamID& s);
// returns legacy SteamID
std::string id() const;
// returns SteamID3
std::string id3() const;
// returns SteamID64
uint64_t id_i64() const;
// returns account id
uint32_t id_i32() const;
private:
// The internal lower 32bits of SteamID64 (account ID)
uint32_t _ID;
};


Source
#include "SteamID.hpp"
#include <sstream>
#define ID64_HIGHPART 0x0110000100000000
SteamID::SteamID()
  : _ID(0)
{}
SteamID::SteamID(std::string &strSteamID)
  : _ID(0)
{
  std::vector<std::string> IDTokens = split(strSteamID, ':');
  if (IDTokens.size() == 3)
  {
	if (strSteamID[0] == 'S')
	{
	  _ID += strtoll(IDTokens[1].c_str(), nullptr, 10);
	  _ID += (strtoll(IDTokens[2].c_str(), nullptr, 10) * 2);
	}
	else if (strSteamID[0] == 'U')
	{
	  _ID += strtoll(IDTokens[2].c_str(), nullptr, 10);
	  if (!(_ID % 2))
		_ID++;
	}
	else
	{ // failed
	  _ID = 0;
	}
  }
  else
  { // failed
	_ID = 0;
  }
}
SteamID::SteamID(uint64_t &_steamID64)
{
  if ((_steamID64 & ID64_HIGHPART) == ID64_HIGHPART)
  {
	// cast away upper 32 bits
	_ID = static_cast<uint32_t>(_steamID64);
  }
  else
  { // failed
	_ID = 0;
  }
}
SteamID::SteamID(const SteamID & from)
: _ID(from._ID)
{}
SteamID::~SteamID(){}
std::string SteamID::id() const
{
  std::string strID("STEAM_0:");
  if (_ID % 2)
  {
	strID.append("1:");
  }
  else
  {
	strID.append("0:");
  }
  strID.append(std::to_string(_ID / 2));
  return strID;
}
std::string SteamID::id3() const
{
  std::string strID3("U:1:");
  strID3.append(std::to_string(_ID));
  return strID3;
}
uint64_t SteamID::id_i64() const
{ return (static_cast<uint64_t>(_ID) | ID64_HIGHPART); }
uint32_t SteamID::id_i32() const
{ return uint32_t(_ID); }
std::ostream& operator<<(std::ostream& os, const SteamID& s)
{
  os << s._ID;
  return os;
}
std::istream & operator >> (std::istream & is, SteamID & s)
{
  is >> s._ID;
  return is;
}

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems)
{
  std::stringstream ss(s);
  std::string item;
  while (std::getline(ss, item, delim))
	elems.push_back(item);
  return elems;
}

std::vector<std::string> split(const std::string &s, char delim)
{
  std::vector<std::string> elems;
  split(s, delim, elems);
  return elems;
}



#2
Burnt

Burnt

    HG Veteran

  • 1,853 posts
  • LocationLmao


If you're interested in any HGDC Development please let me or thomasjosif know.  You seem to know how to code well enough, and I'm sure your skills can be used to help the HGDC team.  If you'd like to learn sourcemod let me know as well.
Posted Image
Thanks to Icon for the amazing signature!
Posted Image
Posted Image
Posted Image

View Postmegan, on January 29 2015 - 01:32 PM, said:

To be honest go ask everyone on jb who plays constantly erryone loves me i've never heard of no weeman and i never see any councils but burnt

Bunbun said:

Everyone always asks me for stuff, but when I ask for nudes everyones like "noooooo im only 13"




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users