//---------------------------------------------------------------------- // If a pair of valid hex digits exist at the head of the // StringExtractor they are decoded into an unsigned byte and returned // by this function // // If there is not a pair of valid hex digits at the head of the // StringExtractor, it is left unchanged and -1 is returned //---------------------------------------------------------------------- int StringExtractor::DecodeHexU8() { SkipSpaces(); if (GetBytesLeft() < 2) { return -1; } const int hi_nibble = xdigit_to_sint(m_packet[m_index]); const int lo_nibble = xdigit_to_sint(m_packet[m_index + 1]); if (hi_nibble == -1 || lo_nibble == -1) { return -1; } m_index += 2; return (uint8_t)((hi_nibble << 4) + lo_nibble); }
uint64_t StringExtractor::GetHexMaxU64(bool little_endian, uint64_t fail_value) { uint64_t result = 0; uint32_t nibble_count = 0; SkipSpaces(); if (little_endian) { uint32_t shift_amount = 0; while (m_index < m_packet.size() && ::isxdigit(m_packet[m_index])) { // Make sure we don't exceed the size of a uint64_t... if (nibble_count >= (sizeof(uint64_t) * 2)) { m_index = UINT64_MAX; return fail_value; } uint8_t nibble_lo; uint8_t nibble_hi = xdigit_to_sint(m_packet[m_index]); ++m_index; if (m_index < m_packet.size() && ::isxdigit(m_packet[m_index])) { nibble_lo = xdigit_to_sint(m_packet[m_index]); ++m_index; result |= ((uint64_t)nibble_hi << (shift_amount + 4)); result |= ((uint64_t)nibble_lo << shift_amount); nibble_count += 2; shift_amount += 8; } else { result |= ((uint64_t)nibble_hi << shift_amount); nibble_count += 1; shift_amount += 4; } } } else { while (m_index < m_packet.size() && ::isxdigit(m_packet[m_index])) { // Make sure we don't exceed the size of a uint64_t... if (nibble_count >= (sizeof(uint64_t) * 2)) { m_index = UINT64_MAX; return fail_value; } uint8_t nibble = xdigit_to_sint(m_packet[m_index]); // Big Endian result <<= 4; result |= nibble; ++m_index; ++nibble_count; } } return result; }
//---------------------------------------------------------------------- // Extract a signed character from two hex ASCII chars in the packet // string //---------------------------------------------------------------------- int8_t StringExtractor::GetHexS8 (int8_t fail_value) { if (GetNumHexASCIICharsAtFilePos(2)) { char hi_nibble_char = m_packet[m_index]; char lo_nibble_char = m_packet[m_index+1]; if (isxdigit(hi_nibble_char) && isxdigit(lo_nibble_char)) { char hi_nibble = xdigit_to_sint (hi_nibble_char); char lo_nibble = xdigit_to_sint (lo_nibble_char); m_index += 2; return (hi_nibble << 4) + lo_nibble; } } m_index = UINT32_MAX; return fail_value; }