27 static const int8_t C2H[] = {
29 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
30 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
31 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
32 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
33 -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
34 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
35 -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
36 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
37 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
38 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
39 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
40 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
41 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
42 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
43 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
44 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
46 static_assert(std::extent_v<decltype(C2H)> == 256);
49 HexDecode::convert(span<const uint8_t> hex)
56 size_t totalDecodedLen = hex.size() + (m_hasOddByte ? 1 : 0);
57 if (totalDecodedLen % 2 == 1) {
58 m_oddByte = hex.back();
75 unique_ptr<Transform::OBuffer>
76 HexDecode::toBytes(
const uint8_t* hex,
size_t hexLen)
78 size_t bufferSize = (hexLen + (m_hasOddByte ? 1 : 0)) >> 1;
79 auto buffer = make_unique<OBuffer>(bufferSize);
80 auto it = buffer->begin();
83 if (C2H[hex[0]] < 0 || C2H[m_oddByte] < 0)
86 *it = (C2H[m_oddByte] << 4) + C2H[hex[0]];
93 if (C2H[hex[0]] < 0 || C2H[hex[1]] < 0)
96 *it = (C2H[hex[0]] << 4) + C2H[hex[1]];
105 unique_ptr<Transform>
108 return make_unique<HexDecode>();