@@ -239,16 +239,27 @@ size_t base64_decode(char* const dst, const size_t dstlen,
239239}
240240
241241
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)])
252263
253264
254265template <typename TypeName>
@@ -258,11 +269,11 @@ size_t hex_decode(char* buf,
258269 const size_t srcLen) {
259270 size_t i;
260271 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 ]);
263274 if (!~a || !~b)
264275 return i;
265- buf[i] = a * 16 + b;
276+ buf[i] = (a << 4 ) | b;
266277 }
267278
268279 return i;
0 commit comments