@@ -143,16 +143,27 @@ const int8_t unbase64_table[256] =
143
143
};
144
144
145
145
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)])
156
167
157
168
158
169
template <typename TypeName>
@@ -162,11 +173,11 @@ size_t hex_decode(char* buf,
162
173
const size_t srcLen) {
163
174
size_t i;
164
175
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 ]);
167
178
if (!~a || !~b)
168
179
return i;
169
- buf[i] = a * 16 + b;
180
+ buf[i] = (a << 4 ) | b;
170
181
}
171
182
172
183
return i;
0 commit comments