Minsky
a85.cc
Go to the documentation of this file.
1 // a85.cpp
2 
3 #include "a85.h"
4 #include <assert.h>
5 
6 namespace a85 {
7 
8 int size_for_a85(int binlen, bool append_null) {
9  return (binlen * 5 + 3) / 4 + !!append_null;
10 }
11 
12 void to_a85(const u8* data, int binlen, char* text, bool append_null) {
13  data += binlen;
14  text += size_for_a85(binlen,append_null);
15  if (append_null) {
16  *(--text) = 0;
17  }
18  const int rem = binlen & 3;
19  if (rem) {
20  u32 val = 0;
21  for (int i = 4 - rem; i < 4; i++) {
22  val |= *(--data) << (8 * i);
23  }
24  int i;
25  for (i = 0; i < 4 - rem; i++) {
26  val /= 85;
27  }
28  for (; i <= 4; i++) {
29  *(--text) = val % 85 + 33;
30  val /= 85;
31  }
32  binlen &= ~3;
33  }
34  while (binlen) {
35  u32 val = *(--data);
36  val |= *(--data) << 8;
37  val |= *(--data) << 16;
38  val |= *(--data) << 24;
39  *(--text) = val % 85 + 33;
40  val /= 85;
41  *(--text) = val % 85 + 33;
42  val /= 85;
43  *(--text) = val % 85 + 33;
44  val /= 85;
45  *(--text) = val % 85 + 33;
46  val /= 85;
47  *(--text) = val % 85 + 33;
48  binlen -= 4;
49  }
50 }
51 
52 int size_for_bin(int textlen) {
53  return (textlen * 4) / 5;
54 }
55 
56 void from_a85(const char* text, int textlen, u8* data) {
57 #ifndef NDEBUG
58  int binLen=size_for_bin(textlen);
59 #endif
60  while (textlen) {
61  if (textlen < 5) {
62  u32 val = 0;
63  unsigned factor = 52200625;
64  int i;
65  for (i = 0; i < textlen; i++) {
66  val += (*(text++) - 33) * factor;
67  factor /= 85;
68  }
69  for (; i < 5; i++) {
70  val += 'u' * factor;
71  factor /= 85;
72  }
73  int shift = 24;
74  for (i = 0; i < textlen - 1; i++) {
75  *(data++) = val >> shift;
76  shift -= 8;
77  }
78  break;
79  }
80  u32 val = (*(text++) - 33) * 52200625U;
81  val += (*(text++) - 33) * 614125;
82  val += (*(text++) - 33) * 7225;
83  val += (*(text++) - 33) * 85;
84  val += (*(text++) - 33);
85  assert((binLen-=4)>=0);
86  *(data++) = val >> 24;
87  *(data++) = val >> 16;
88  *(data++) = val >> 8;
89  *(data++) = val;
90  textlen -= 5;
91  }
92 }
93 
94 } // namespace a85
int size_for_bin(int textlen)
Definition: a85.cc:52
Definition: a85.cc:6
void to_a85(const u8 *data, int binlen, char *text, bool append_null)
Definition: a85.cc:12
void from_a85(const char *text, int textlen, u8 *data)
Definition: a85.cc:56
uint8_t u8
Definition: a85.h:8
int size_for_a85(int binlen, bool append_null)
Definition: a85.cc:8
uint32_t u32
Definition: a85.h:9