@@ -239,16 +239,27 @@ size_t base64_decode(char* const dst, const size_t dstlen,
239
239
}
240
240
241
241
242
- template <typename TypeName>
243
- unsigned hex2bin (TypeName c) {
244
- if (c >= ' 0' && c <= ' 9' )
245
- return c - ' 0' ;
246
- if (c >= ' A' && c <= ' F' )
247
- return 10 + (c - ' A' );
248
- if (c >= ' a' && c <= ' f' )
249
- return 10 + (c - ' a' );
250
- return static_cast <unsigned >(-1 );
251
- }
242
+ static const int8_t unhex_table[256 ] =
243
+ { -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
244
+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
245
+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
246
+ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , -1 , -1 , -1 , -1 , -1 , -1 ,
247
+ -1 , 10 , 11 , 12 , 13 , 14 , 15 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
248
+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
249
+ -1 , 10 , 11 , 12 , 13 , 14 , 15 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
250
+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
251
+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
252
+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
253
+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
254
+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
255
+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
256
+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
257
+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
258
+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1
259
+ };
260
+
261
+ #define unhex (x ) \
262
+ static_cast <unsigned >(unhex_table[static_cast <uint8_t >(x)])
252
263
253
264
254
265
template <typename TypeName>
@@ -258,11 +269,11 @@ size_t hex_decode(char* buf,
258
269
const size_t srcLen) {
259
270
size_t i;
260
271
for (i = 0 ; i < len && i * 2 + 1 < srcLen; ++i) {
261
- unsigned a = hex2bin (src[i * 2 + 0 ]);
262
- unsigned b = hex2bin (src[i * 2 + 1 ]);
272
+ unsigned a = unhex (src[i * 2 + 0 ]);
273
+ unsigned b = unhex (src[i * 2 + 1 ]);
263
274
if (!~a || !~b)
264
275
return i;
265
- buf[i] = a * 16 + b;
276
+ buf[i] = (a << 4 ) | b;
266
277
}
267
278
268
279
return i;
0 commit comments