Line data Source code
1 : #include "fd_hex.h" 2 : 3 : /* FIXME use LUT instead? */ 4 : static inline int 5 49476 : fd_hex_unhex( int c ) { 6 49476 : if( c>='0' && c<='9' ) return c-'0'; 7 16179 : 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 831 : ulong sz ) { 18 : 19 831 : uchar * dst = _dst; 20 : 21 831 : ulong i; 22 25569 : for( i=0; i<sz; i++ ) { 23 24738 : int hi = fd_hex_unhex( *hex++ ); 24 24738 : int lo = fd_hex_unhex( *hex++ ); 25 24738 : if( FD_UNLIKELY( (hi<0) | (lo<0) ) ) return i; 26 24738 : *dst++ = (uchar)( ((uint)hi<<4) | (uint)lo ); 27 24738 : } 28 : 29 831 : return i; 30 831 : } 31 : 32 : char * 33 : fd_hex_encode( char * dst, 34 : void const * _src, 35 96240 : ulong sz ) { 36 96240 : uchar const * src = (uchar const *)_src; 37 96240 : static char const lut[ 16 ] = "0123456789abcdef"; 38 3175920 : for( ulong j=0UL; j<sz; j++ ) { 39 3079680 : ulong c = src[j]; 40 3079680 : *dst++ = lut[ c >> 4UL ]; 41 3079680 : *dst++ = lut[ c & 0xfUL ]; 42 3079680 : } 43 96240 : return dst; 44 96240 : } 45 :