@@ -143,16 +143,27 @@ const int8_t unbase64_table[256] =
143143 };
144144
145145
146- template <typename TypeName>
147- unsigned hex2bin (TypeName c) {
148- if (c >= ' 0' && c <= ' 9' )
149- return c - ' 0' ;
150- if (c >= ' A' && c <= ' F' )
151- return 10 + (c - ' A' );
152- if (c >= ' a' && c <= ' f' )
153- return 10 + (c - ' a' );
154- return static_cast <unsigned >(-1 );
155- }
146+ static const int8_t unhex_table[256 ] =
147+ { -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
148+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
149+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
150+ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , -1 , -1 , -1 , -1 , -1 , -1 ,
151+ -1 , 10 , 11 , 12 , 13 , 14 , 15 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
152+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
153+ -1 , 10 , 11 , 12 , 13 , 14 , 15 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
154+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
155+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
156+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
157+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
158+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
159+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
160+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
161+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
162+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1
163+ };
164+
165+ #define unhex (x ) \
166+ static_cast <unsigned >(unhex_table[static_cast <uint8_t >(x)])
156167
157168
158169template <typename TypeName>
@@ -162,11 +173,11 @@ size_t hex_decode(char* buf,
162173 const size_t srcLen) {
163174 size_t i;
164175 for (i = 0 ; i < len && i * 2 + 1 < srcLen; ++i) {
165- unsigned a = hex2bin (src[i * 2 + 0 ]);
166- unsigned b = hex2bin (src[i * 2 + 1 ]);
176+ unsigned a = unhex (src[i * 2 + 0 ]);
177+ unsigned b = unhex (src[i * 2 + 1 ]);
167178 if (!~a || !~b)
168179 return i;
169- buf[i] = a * 16 + b;
180+ buf[i] = (a << 4 ) | b;
170181 }
171182
172183 return i;
0 commit comments