Line data Source code
1 : #include "fd_hex.h" 2 : 3 : /* FIXME use LUT instead? */ 4 : static inline int 5 43356 : fd_hex_unhex( int c ) { 6 43356 : if( c>='0' && c<='9' ) return c-'0'; 7 13860 : if( c>='a' && c<='f' ) return c-'a'+0xa; 8 3162 : if( c>='A' && c<='F' ) return c-'A'+0xa; 9 0 : return -1; 10 3162 : } 11 : 12 : /* TODO: add AVX version */ 13 : 14 : ulong 15 : fd_hex_decode( void * _dst, 16 : char const * hex, 17 747 : ulong sz ) { 18 : 19 747 : uchar * dst = _dst; 20 : 21 747 : ulong i; 22 22425 : for( i=0; i<sz; i++ ) { 23 21678 : int hi = fd_hex_unhex( *hex++ ); 24 21678 : int lo = fd_hex_unhex( *hex++ ); 25 21678 : if( FD_UNLIKELY( (hi<0) | (lo<0) ) ) return i; 26 21678 : *dst++ = (uchar)( ((uint)hi<<4) | (uint)lo ); 27 21678 : } 28 : 29 747 : return i; 30 747 : } 31 : 32 : char * 33 : fd_hex_encode( char * dst, 34 : void const * _src, 35 96192 : ulong sz ) { 36 96192 : uchar const * src = (uchar const *)_src; 37 96192 : static char const lut[ 16 ] = "0123456789abcdef"; 38 3174336 : for( ulong j=0UL; j<sz; j++ ) { 39 3078144 : ulong c = src[j]; 40 3078144 : *dst++ = lut[ c >> 4UL ]; 41 3078144 : *dst++ = lut[ c & 0xfUL ]; 42 3078144 : } 43 96192 : return dst; 44 96192 : } 45 :