xref: /inferno-os/appl/lib/encoding/base16.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Encoding;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "encoding.m";
4*37da2899SCharles.Forsyth
5*37da2899SCharles.Forsythhex: con "0123456789ABCDEF";
6*37da2899SCharles.Forsyth
7*37da2899SCharles.Forsythenc(a: array of byte): string
8*37da2899SCharles.Forsyth{
9*37da2899SCharles.Forsyth	o: string;
10*37da2899SCharles.Forsyth	for(i := 0; i < len a; i++){
11*37da2899SCharles.Forsyth		n := int a[i];
12*37da2899SCharles.Forsyth		o[len o] = hex[n>>4];
13*37da2899SCharles.Forsyth		o[len o] = hex[n & 16rF];
14*37da2899SCharles.Forsyth	}
15*37da2899SCharles.Forsyth	return o;
16*37da2899SCharles.Forsyth}
17*37da2899SCharles.Forsyth
18*37da2899SCharles.Forsythdec(s: string): array of byte
19*37da2899SCharles.Forsyth{
20*37da2899SCharles.Forsyth	a := array[(len s+1)/2] of byte;	# upper bound
21*37da2899SCharles.Forsyth	o := 0;
22*37da2899SCharles.Forsyth	j := 0;
23*37da2899SCharles.Forsyth	n := 0;
24*37da2899SCharles.Forsyth	for(i := 0; i < len s; i++){
25*37da2899SCharles.Forsyth		c := s[i];
26*37da2899SCharles.Forsyth		n <<= 4;
27*37da2899SCharles.Forsyth		case c {
28*37da2899SCharles.Forsyth		'0' to '9' =>
29*37da2899SCharles.Forsyth			n |= c-'0';
30*37da2899SCharles.Forsyth		'A' to 'F' =>
31*37da2899SCharles.Forsyth			n |= c-'A'+10;
32*37da2899SCharles.Forsyth		'a' to 'f' =>
33*37da2899SCharles.Forsyth			n |= c-'a'+10;
34*37da2899SCharles.Forsyth		* =>
35*37da2899SCharles.Forsyth			continue;
36*37da2899SCharles.Forsyth		}
37*37da2899SCharles.Forsyth		if(++j == 2){
38*37da2899SCharles.Forsyth			a[o++] = byte n;
39*37da2899SCharles.Forsyth			j = n = 0;
40*37da2899SCharles.Forsyth		}
41*37da2899SCharles.Forsyth	}
42*37da2899SCharles.Forsyth	return a[0:o];
43*37da2899SCharles.Forsyth}
44