Base36

Base36 is a binary-to-text encoding scheme that represents binary data in an ASCII string format by translating it into a radix-36 (aka Hexatrigesimal) representation. The choice of 36 is convenient in that the digits can be represented using the Arabic numerals 0–9 and the Latin letters A–Z[1] (the ISO basic Latin alphabet).

Each base36 digit needs less than 6 bits of information to be represented.

Conversion

Signed 32- and 64-bit integers will only hold at most 6 or 13 base-36 digits, respectively (that many base-36 digits overflow the 32- and 64-bit integers). For example, the 64-bit signed integer maximum value of "9223372036854775807" is "1Y2P0IJ32E8E7" in base-36.

Java implementation

Java SE supports conversion from/to String to different bases from 2 up to 36. For example, and

PHP implementation

PHP, like Java, supports conversion from/to String to different bases from 2 up to 36. Use the base_convert function, available since PHP 4.

C implementation

static char *base36enc(long unsigned int value)
{
	char base36[36] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	/* log(2**64) / log(36) = 12.38 => max 13 char + '\0' */
	char buffer[14];
	unsigned int offset = sizeof(buffer);

	buffer[--offset] = '\0';
	do {
		buffer[--offset] = base36[value % 36];
	} while (value /= 36);

	return strdup(&buffer[offset]); // warning: this must be free-d by the user
}

static long unsigned int base36dec(const char *text)
{
	return strtoul(text, NULL, 36);
}

Python implementation

def base36encode(integer):
    chars, encoded = '0123456789abcdefghijklmnopqrstuvwxyz', ''

    while integer > 0:
        integer, remainder = divmod(integer, 36)
        encoded = chars[remainder] + encoded

    return encoded

Perl implementation

sub base36encode {
     my @map = split//,"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     my $number = shift;
     my $output = "";
     my ($q,$r);

     do {
          ($q,$r) = (int($number/36),$number%36);
          $number /= 36;
          $output = $map[$r] . $output;
          } while ($q);

     return $output;
}

C++ implementation

std::string to_base36(unsigned int val)
{
	static std::string base36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	std::string result;
	result.reserve(14);
	do {
		result = base36[val % 36] + result;
	} while (val /= 36);
	return result;
}

C# implementation

private static string ToBase36(ulong value)
{
    const string base36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var sb = new StringBuilder(13);
    do
    {
       sb.Insert(0, base36[(byte)(value % 36)]);
       value /= 36;
    } while (value != 0);
    return sb.ToString();
}

bash implementation

value=$1
result=""
base36="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
while true; do
	result=${base36:((value%36)):1}${result}
	if [ $((value=${value}/36)) -eq 0 ]; then
		break
	fi
done
echo ${result}

Visual Basic implementation

Public Function ToBase36String(i as UInteger) As String
    Const rainbow = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    i = Math.Abs(i)
    Dim sb = New StringBuilder()
    Do
        sb.Insert(0, rainbow(i Mod 36))
        i /= 36
    Loop While i <> 0
    Return sb.ToString()
End Function

Swift implementation

extension Integer {
    // Convert any integer type to any base (2—36)
    func toBase(_ b: Int) -> String
    {
        guard (2...36).contains(b) else {
            fatalError("Base out of range; 2 — 36 supported")
        }
        let digits = ["0","1","2","3","4","5","6","7","8","9",
                      "a","b","c","d","e","f","g","h","i","j",
                      "k","l","m","n","o","p","q","r","s","t",
                      "u","v","w","x","y","z"]
        var result = ""
        
        if let v = self as? Int {
            var value = abs(v)
            repeat {
                result = digits[value % b] + result
                value = value / b
            } while (value > 0)
        }
        return self > 0 ? result : "-" + result
    }
}

// Swift 3 built-in
String(myInt, radix: 36)

Uses in practice

References

  1. Hope, Paco; Walther, Ben (2008), Web Security Testing Cookbook, Sebastopol, CA: O'Reilly Media, Inc., ISBN 978-0-596-51483-9
  2. Sage SalesLogix base-36 identifiers: http://www.slxdeveloper.com/page.aspx?action=viewarticle&articleid=87
  3. FileStore "Archived copy". Archived from the original on 2008-12-02. Retrieved 2009-05-06.
  4. "QR Code encode mode for short URLs"
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.