<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: conversion code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Thu, 21 Aug 2008 14:04:11 GMT</pubDate>
    <description>DZone Snippets: conversion code</description>
    <item>
      <title>Custom base conversion (to and from)</title>
      <link>http://snippets.dzone.com/posts/show/4594</link>
      <description>Handy to store large numbers in a shorter notation. Doesn't work with negative numbers (for negative numbers you need to store an additional byte to indicate a positive or negative value, pass the absolute value).&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;	private static final short BASE_40_RADIX = 40;&lt;br /&gt;	private static final short BASE_40_BASE = 48;&lt;br /&gt;	private static final String BASE_40_ZERO = "0";&lt;br /&gt;&lt;br /&gt;	public static long fromBase40(char[] cs) {&lt;br /&gt;		return fromBase(cs, BASE_40_BASE, BASE_40_RADIX);&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public static char[] toBase40(final long i) {&lt;br /&gt;		return toBase(i, BASE_40_BASE, BASE_40_RADIX, BASE_40_ZERO);&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	private static final short BASE_75_RADIX = 75;&lt;br /&gt;	private static final short BASE_75_BASE = 48;&lt;br /&gt;	private static final String BASE_75_ZERO = "0";&lt;br /&gt;&lt;br /&gt;	public static long fromBase75(char[] cs) {&lt;br /&gt;		return fromBase(cs, BASE_75_BASE, BASE_75_RADIX);&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public static char[] toBase75(final long i) {&lt;br /&gt;		return toBase(i, BASE_75_BASE, BASE_75_RADIX, BASE_75_ZERO);&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	private static final short BASE_90_RADIX = 90;&lt;br /&gt;	private static final short BASE_90_BASE = 33;&lt;br /&gt;	private static final String BASE_90_ZERO = "!";&lt;br /&gt;&lt;br /&gt;	public static long fromBase90(char[] cs) {&lt;br /&gt;		return fromBase(cs, BASE_90_BASE, BASE_90_RADIX);&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public static char[] toBase90(final long i) {&lt;br /&gt;		return toBase(i, BASE_90_BASE, BASE_90_RADIX, BASE_90_ZERO);&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	private static char[] toBase(final long i, final short base, final short radix, String nullCharacter) {&lt;br /&gt;		long value = i;&lt;br /&gt;&lt;br /&gt;		if (value == 0) {&lt;br /&gt;			return nullCharacter.toCharArray();&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		String result = "";&lt;br /&gt;		while (value &gt; 0) {&lt;br /&gt;			long mod = value % radix;&lt;br /&gt;			value -= mod;&lt;br /&gt;			if (value &gt; 0) value /= radix;&lt;br /&gt;			result = (char)(mod + base) + result;&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		return result.toCharArray();&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	private static long fromBase(char[] cs, final short base, final short radix) {&lt;br /&gt;		long value = 0;&lt;br /&gt;		for (int i = cs.length - 1; i &gt;= 0; i--) {&lt;br /&gt;			int digit = ((int)cs[i]) - base;&lt;br /&gt;			if (digit &lt; 0 || digit &gt;= radix) {&lt;br /&gt;				throw new IllegalArgumentException("Invalid Base" + radix + " character: " + cs[i]);&lt;br /&gt;			}&lt;br /&gt;			long digitBase = (long)Math.pow(radix, (cs.length - 1) - i);&lt;br /&gt;			value = (digit * digitBase) + value;&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		return value;&lt;br /&gt;	}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And here are some tests:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;	public void testFromBase40() {&lt;br /&gt;		assertEquals(2559999, NumberUtils.fromBase40("WWWW".toCharArray()));&lt;br /&gt;		assertEquals(1117580, NumberUtils.fromBase40("ABCD".toCharArray()));&lt;br /&gt;&lt;br /&gt;		assertEquals(0, NumberUtils.fromBase40("0".toCharArray()));&lt;br /&gt;		assertEquals(1, NumberUtils.fromBase40("1".toCharArray()));&lt;br /&gt;&lt;br /&gt;		assertEquals(40, NumberUtils.fromBase40("10".toCharArray()));&lt;br /&gt;		assertEquals(80, NumberUtils.fromBase40("20".toCharArray()));&lt;br /&gt;&lt;br /&gt;		assertEquals(41, NumberUtils.fromBase40("11".toCharArray()));&lt;br /&gt;		assertEquals(81, NumberUtils.fromBase40("21".toCharArray()));&lt;br /&gt;&lt;br /&gt;		assertEquals(81, NumberUtils.fromBase40("0021".toCharArray()));&lt;br /&gt;&lt;br /&gt;		assertEquals(3061560805L, NumberUtils.fromBase40("MSTSD5".toCharArray()));&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public void testToBase40() {&lt;br /&gt;		assertEquals("0", new String(NumberUtils.toBase40(0)));&lt;br /&gt;		assertEquals("1", new String(NumberUtils.toBase40(1)));&lt;br /&gt;&lt;br /&gt;		assertEquals("10", new String(NumberUtils.toBase40(40)));&lt;br /&gt;		assertEquals("20", new String(NumberUtils.toBase40(80)));&lt;br /&gt;&lt;br /&gt;		assertEquals("11", new String(NumberUtils.toBase40(41)));&lt;br /&gt;		assertEquals("21", new String(NumberUtils.toBase40(81)));&lt;br /&gt;&lt;br /&gt;		assertEquals("ABCD", new String(NumberUtils.toBase40(1117580)));&lt;br /&gt;		assertEquals("WWWW", new String(NumberUtils.toBase40(2559999)));&lt;br /&gt;&lt;br /&gt;		assertEquals("MSTSD5", new String(NumberUtils.toBase40(3061560805L)));&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public void testToBase90() throws Exception {&lt;br /&gt;		assertEquals("#Q&amp;Y.`QY#", new String(NumberUtils.toBase90(10908158098650842L)));&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public void testFromBase90() throws Exception {&lt;br /&gt;		assertEquals(10908158098650842L, NumberUtils.fromBase90("#Q&amp;Y.`QY#".toCharArray()));&lt;br /&gt;	}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;</description>
      <pubDate>Sun, 30 Sep 2007 23:44:48 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4594</guid>
      <author>devijvers (Steven Devijver)</author>
    </item>
  </channel>
</rss>
