Session-ID & Game-ID

Warum ID's

Der 18xx-Server verwaltet Spiele und Clients. Hierzu wird jedem Spiel eine eindeutige Game-ID (kurz GID) und jedem Client ein eindeutige Session-ID (kurz SID) zugeordnet.

Diese ID's werden intern als von 1 beginnender Zähler verwaltet. Angezeigt werden die ID's jedoch nicht als Nummer, sondern als Buchstaben und Ziffernkombination:

Dieses Darstellung hat 2 Vorteile gegenüber einer rein numerischen Darstellung:

Ein paar Beispiele:

 Nummer   ID 
 0   A00 
 1   A01 
 99   A99 
 100   B00 
 5199   z99 
 5200   BA00 
 154972   dp72 
 270400   BAA00 

Darstellung einer ID

  DEBUG-INFO: Text unvollständig/fehlerhaft  

Umrechnung Zahl nach ID

Zur Umrechnung einer Zahl in eine ID verwende ich die folgende Funktion:
string CreateAlphaNumericID ( uint32 id )
{
    // Auseichend großen temporären Buffer bereitstellen
    const int bufsize = 30;
    char buf[bufsize];
    char *dest = buf+bufsize;

    // Null-Terminator
    *--dest = 0;

    // 2. Ziffer
    *--dest = '0' + id % 10;
    id /= 10;

    // 1. Ziffer
    *--dest = '0' + id % 10;
    id /= 10;

    // Tabelle mit Buchstaben
    static char tab[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    // Alle nötigen Buchstaben, jedoch mindestens einer
    do
    {
	*--dest = tab[ id % 52 ];
	id /= 52;
    } while(id);


    // Ergebnis einem C++ String zuweisen und zurückgeben.
    string str;
    str = dest;
    return str;
}

Umrechnung ID nach Zahl

Für die Umrechnung einer ID in eine Zahl verwende ich den folgenden Code:
char * ScanAlphaNumericID ( uint32 &result_id, ccp source )
{
    SkipSpaces(source);

    uint32 id = 0;
    for(;;)
    {
	char ch = *source++;
	if ( ch >= '0' && ch <= '9' )
	{
	    id = 10 * id + ch - '0';
	}
	else if ( ch >= 'A' && ch <= 'Z' )
	{
	    id = 52 * id + ch - 'A';
	}
	else if ( ch >= 'a' && ch <= 'z' )
	{
	    id = 52 * id + ch - 'a' + 26;
	}
	else break;
    }

    result_id = id;
    return (char*)source - 1;
}