1 #include <u.h>
2 #include <libc.h>
3 static char t16e[] = "0123456789ABCDEF";
4
5 int
dec16(uchar * out,int lim,char * in,int n)6 dec16(uchar *out, int lim, char *in, int n)
7 {
8 int c, w = 0, i = 0;
9 uchar *start = out;
10 uchar *eout = out + lim;
11
12 while(n-- > 0){
13 c = *in++;
14 if('0' <= c && c <= '9')
15 c = c - '0';
16 else if('a' <= c && c <= 'z')
17 c = c - 'a' + 10;
18 else if('A' <= c && c <= 'Z')
19 c = c - 'A' + 10;
20 else
21 continue;
22 w = (w<<4) + c;
23 i++;
24 if(i == 2){
25 if(out + 1 > eout)
26 goto exhausted;
27 *out++ = w;
28 w = 0;
29 i = 0;
30 }
31 }
32 exhausted:
33 return out - start;
34 }
35
36 int
enc16(char * out,int lim,uchar * in,int n)37 enc16(char *out, int lim, uchar *in, int n)
38 {
39 uint c;
40 char *eout = out + lim;
41 char *start = out;
42
43 while(n-- > 0){
44 c = *in++;
45 if(out + 2 >= eout)
46 goto exhausted;
47 *out++ = t16e[c>>4];
48 *out++ = t16e[c&0xf];
49 }
50 exhausted:
51 *out = 0;
52 return out - start;
53 }
54