1
- //base1432le .c
2
- //fumiama 20210408
1
+ // base1432 .c
2
+ // fumiama 20220319
3
3
#include <stdio.h>
4
4
#include <stdlib.h>
5
5
#ifdef __linux__
37
37
#endif
38
38
#include "base14.h"
39
39
40
- //#define DEBUG
40
+ // #define DEBUG
41
41
42
- #ifndef new
43
- #define new malloc
44
- #endif
45
-
46
- LENDAT * encode (const uint8_t * data , const int32_t len ) {
47
- LENDAT * encd = (LENDAT * )new (sizeof (LENDAT ));
48
- int32_t outlen = len / 7 * 8 ;
49
- uint8_t offset = len % 7 ;
50
- switch (offset ) { //算上偏移标志字符占用的2字节
42
+ int encode (const char * data , int dlen , char * buf , int blen ) {
43
+ int outlen = dlen / 7 * 8 ;
44
+ int offset = dlen % 7 ;
45
+ switch (offset ) { // 算上偏移标志字符占用的2字节
51
46
case 0 : break ;
52
47
case 1 : outlen += 4 ; break ;
53
48
case 2 :
@@ -60,12 +55,10 @@ LENDAT* encode(const uint8_t* data, const int32_t len) {
60
55
#ifdef DEBUG
61
56
printf ("outlen: %llu, offset: %u, malloc: %llu\n" , outlen , offset , outlen + 8 );
62
57
#endif
63
- encd -> data = (uint8_t * )new (outlen + 8 ); //冗余的8B用于可能的结尾的覆盖
64
- encd -> len = outlen ;
65
- uint32_t * vals = (uint32_t * )(encd -> data );
58
+ uint32_t * vals = (uint32_t * )buf ;
66
59
uint32_t n = 0 ;
67
60
int32_t i = 0 ;
68
- for (; i <= len - 7 ; i += 7 ) {
61
+ for (; i <= dlen - 7 ; i += 7 ) {
69
62
register uint32_t sum = 0 ;
70
63
register uint32_t shift = htobe32 (* (uint32_t * )(data + i ));
71
64
sum |= (shift >>2 ) & 0x3fff0000 ;
@@ -118,19 +111,18 @@ LENDAT* encode(const uint8_t* data, const int32_t len) {
118
111
#else
119
112
vals [n ] = sum ;
120
113
#endif
121
- encd -> data [outlen - 2 ] = '=' ;
122
- encd -> data [outlen - 1 ] = offset ;
114
+ buf [outlen - 2 ] = '=' ;
115
+ buf [outlen - 1 ] = offset ;
123
116
}
124
- return encd ;
117
+ return outlen ;
125
118
}
126
119
127
- LENDAT * decode (const uint8_t * data , const int32_t len ) {
128
- LENDAT * decd = (LENDAT * )new (sizeof (LENDAT ));
129
- int32_t outlen = len ;
130
- uint8_t offset = 0 ;
131
- if (data [len - 2 ] == '=' ) {
132
- offset = data [len - 1 ];
133
- switch (offset ) { //算上偏移标志字符占用的2字节
120
+ int decode (const char * data , int dlen , char * buf , int blen ) {
121
+ int outlen = dlen ;
122
+ int offset = 0 ;
123
+ if (data [dlen - 2 ] == '=' ) {
124
+ offset = data [dlen - 1 ];
125
+ switch (offset ) { // 算上偏移标志字符占用的2字节
134
126
case 0 : break ;
135
127
case 1 : outlen -= 4 ; break ;
136
128
case 2 :
@@ -142,12 +134,10 @@ LENDAT* decode(const uint8_t* data, const int32_t len) {
142
134
}
143
135
}
144
136
outlen = outlen / 8 * 7 + offset ;
145
- decd -> data = (uint8_t * )new (outlen + 1 ); //多出1字节用于循环覆盖
146
- decd -> len = outlen ;
147
137
uint32_t * vals = (uint32_t * )data ;
148
138
uint32_t n = 0 ;
149
139
int32_t i = 0 ;
150
- for (; i <= outlen - 7 ; i += 7 ) { //n实际每次自增2
140
+ for (; i <= outlen - 7 ; i += 7 ) { // n实际每次自增2
151
141
register uint32_t sum = 0 ;
152
142
register uint32_t shift = htobe32 (vals [n ++ ]) - 0x4e004e00 ;
153
143
shift <<= 2 ;
@@ -156,44 +146,44 @@ LENDAT* decode(const uint8_t* data, const int32_t len) {
156
146
sum |= shift & 0x0003fff0 ;
157
147
shift = htobe32 (vals [n ++ ]) - 0x4e004e00 ;
158
148
sum |= shift >> 26 ;
159
- * (uint32_t * )(decd -> data + i ) = be32toh (sum );
149
+ * (uint32_t * )(buf + i ) = be32toh (sum );
160
150
sum = 0 ;
161
151
shift <<= 6 ;
162
152
sum |= shift & 0xffc00000 ;
163
153
shift <<= 2 ;
164
154
sum |= shift & 0x003fff00 ;
165
- * (uint32_t * )(decd -> data + i + 4 ) = be32toh (sum );
155
+ * (uint32_t * )(buf + i + 4 ) = be32toh (sum );
166
156
}
167
157
if (offset -- ) {
168
- //这里有读取越界
158
+ // 这里有读取越界
169
159
#ifdef WORDS_BIGENDIAN
170
160
register uint32_t sum = __builtin_bswap32 (vals [n ++ ]);
171
161
#else
172
162
register uint32_t sum = vals [n ++ ];
173
163
#endif
174
164
sum -= 0x0000004e ;
175
- decd -> data [i ++ ] = ((sum & 0x0000003f ) << 2 ) | ((sum & 0x0000c000 ) >> 14 );
165
+ buf [i ++ ] = ((sum & 0x0000003f ) << 2 ) | ((sum & 0x0000c000 ) >> 14 );
176
166
if (offset -- ) {
177
167
sum -= 0x004e0000 ;
178
- decd -> data [i ++ ] = ((sum & 0x00003f00 ) >> 6 ) | ((sum & 0x00300000 ) >> 20 );
168
+ buf [i ++ ] = ((sum & 0x00003f00 ) >> 6 ) | ((sum & 0x00300000 ) >> 20 );
179
169
if (offset -- ) {
180
- decd -> data [i ++ ] = ((sum & 0x000f0000 ) >> 12 ) | ((sum & 0xf0000000 ) >> 28 );
170
+ buf [i ++ ] = ((sum & 0x000f0000 ) >> 12 ) | ((sum & 0xf0000000 ) >> 28 );
181
171
if (offset -- ) {
182
- decd -> data [i ++ ] = (sum & 0x0f000000 ) >> 20 ;
183
- //这里有读取越界
172
+ buf [i ++ ] = (sum & 0x0f000000 ) >> 20 ;
173
+ // 这里有读取越界
184
174
sum = vals [n ];
185
175
sum -= 0x0000004e ;
186
- decd -> data [i ++ ] |= (sum & 0x0000003c ) >> 2 ;
176
+ buf [i ++ ] |= (sum & 0x0000003c ) >> 2 ;
187
177
if (offset -- ) {
188
- decd -> data [i ++ ] = ((sum & 0x00000003 ) << 6 ) | ((sum & 0x0000fc00 ) >> 10 );
178
+ buf [i ++ ] = ((sum & 0x00000003 ) << 6 ) | ((sum & 0x0000fc00 ) >> 10 );
189
179
if (offset -- ) {
190
180
sum -= 0x004e0000 ;
191
- decd -> data [i ] = ((sum & 0x00000300 ) >> 2 ) | ((sum & 0x003f0000 ) >> 16 );
181
+ buf [i ] = ((sum & 0x00000300 ) >> 2 ) | ((sum & 0x003f0000 ) >> 16 );
192
182
}
193
183
}
194
184
}
195
185
}
196
186
}
197
187
}
198
- return decd ;
188
+ return outlen ;
199
189
}
0 commit comments