code: purgatorio

ref: ad5a80bfb081dc954be03836cc65090e0f6c7e4f
dir: /appl/lib/encoding/base16.b/

View raw version
implement Encoding;

include "encoding.m";

hex: con "0123456789ABCDEF";

enc(a: array of byte): string
{
	o: string;
	for(i := 0; i < len a; i++){
		n := int a[i];
		o[len o] = hex[n>>4];
		o[len o] = hex[n & 16rF];
	}
	return o;
}

dec(s: string): array of byte
{
	a := array[(len s+1)/2] of byte;	# upper bound
	o := 0;
	j := 0;
	n := 0;
	for(i := 0; i < len s; i++){
		c := s[i];
		n <<= 4;
		case c {
		'0' to '9' =>
			n |= c-'0';
		'A' to 'F' =>
			n |= c-'A'+10;
		'a' to 'f' =>
			n |= c-'a'+10;
		* =>
			continue;
		}
		if(++j == 2){
			a[o++] = byte n;
			j = n = 0;
		}
	}
	return a[0:o];
}