Keyple Util C++ Library 2.3.0.5-SNAPSHOT
Reference Terminal Reader API for C++
HexUtil.cpp
Go to the documentation of this file.
1/**************************************************************************************************
2 * Copyright (c) 2021 Calypso Networks Association https://calypsonet.org/ *
3 * *
4 * See the NOTICE file(s) distributed with this work for additional information regarding *
5 * copyright ownership. *
6 * *
7 * This program and the accompanying materials are made available under the terms of the Eclipse *
8 * Public License 2.0 which is available at http://www.eclipse.org/legal/epl-2.0 *
9 * *
10 * SPDX-License-Identifier: EPL-2.0 *
11 **************************************************************************************************/
12
13#include "HexUtil.h"
14
15#include <sstream>
16
17/* Keyple Core Util */
19
20namespace keyple {
21namespace core {
22namespace util {
23
25
26const std::vector<std::string> HexUtil::mByteToHex = {
27 "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F",
28 "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B", "1C", "1D", "1E", "1F",
29 "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F",
30 "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B", "3C", "3D", "3E", "3F",
31 "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4A", "4B", "4C", "4D", "4E", "4F",
32 "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5A", "5B", "5C", "5D", "5E", "5F",
33 "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6A", "6B", "6C", "6D", "6E", "6F",
34 "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7A", "7B", "7C", "7D", "7E", "7F",
35 "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8A", "8B", "8C", "8D", "8E", "8F",
36 "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9A", "9B", "9C", "9D", "9E", "9F",
37 "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "AA", "AB", "AC", "AD", "AE", "AF",
38 "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF",
39 "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB", "CC", "CD", "CE", "CF",
40 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF",
41 "E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF",
42 "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF"
43};
44
45const std::vector<uint8_t> HexUtil::mHexToNibble = {
46 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
47 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
48 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
49 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
50 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
51 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
52 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
53 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
54 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
55 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
56 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
57 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
58 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
59 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
60 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
61 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
62};
63
64HexUtil::HexUtil() {}
65
66bool HexUtil::isValid(const std::string& hex)
67{
68 if (hex.length() == 0 || hex.length() % 2 != 0) {
69 return false;
70 }
71
72 for (int i = 0; i < static_cast<int>(hex.size()); i++) {
73 if (mHexToNibble[hex.at(i)] == 0xFF) {
74 return false;
75 }
76 }
77
78 return true;
79}
80
81const std::vector<uint8_t> HexUtil::toByteArray(const std::string& hex)
82{
83 std::vector<uint8_t> tab(hex.size() / 2);
84
85 if (hex.length() % 2) {
86 throw StringIndexOutOfBoundsException("string has odd length");
87 }
88
89 for (int i = 0; i < static_cast<int>(hex.length()); i += 2) {
90 tab[i / 2] = ((mHexToNibble[hex.at(i)] << 4) +
91 (mHexToNibble[hex.at(i + 1)] & 0xFF));
92 }
93
94 return tab;
95}
96
97uint8_t HexUtil::toByte(const std::string& hex)
98{
99 uint8_t val = 0;
100
101 for (int i = 0; i < static_cast<int>(hex.length()); i++) {
102 val <<= 4;
103 val |= (mHexToNibble[hex.at(i)] & 0xFF);
104 }
105
106 return val;
107}
108
109uint16_t HexUtil::toShort(const std::string& hex)
110{
111 uint16_t val = 0;
112
113 for (int i = 0; i < static_cast<int>(hex.length()); i++) {
114 val <<= 4;
115 val |= (mHexToNibble[hex.at(i)] & 0xFF);
116 }
117
118 return val;
119}
120
121uint32_t HexUtil::toInt(const std::string& hex)
122{
123 uint32_t val = 0;
124
125 for (int i = 0; i < static_cast<int>(hex.length()); i++) {
126 val <<= 4;
127 val |= (mHexToNibble[hex.at(i)] & 0xFF);
128 }
129
130 return val;
131}
132
133uint64_t HexUtil::toLong(const std::string& hex)
134{
135 uint64_t val = 0;
136
137 for (int i = 0; i < static_cast<int>(hex.length()); i++) {
138 val <<= 4;
139 val |= (mHexToNibble[hex.at(i)] & 0xFF);
140 }
141
142 return val;
143}
144
145const std::string HexUtil::toHex(const std::vector<uint8_t>& tab)
146{
147 std::stringstream ss;
148
149 for (const auto& b : tab) {
150 ss << (mByteToHex[b & 0xFF]);
151 }
152
153 return ss.str();
154}
155
156const std::string HexUtil::toHex(const uint8_t val)
157{
158 return mByteToHex[val & 0xFF];
159}
160
161const std::string HexUtil::toHex(const uint16_t val)
162{
163 if ((val & 0xFF00) == 0) {
164 return mByteToHex[val & 0xFF];
165 }
166
167 return mByteToHex[val >> 8 & 0xFF] + mByteToHex[val & 0xFF];
168}
169
170const std::string HexUtil::toHex(const uint32_t val)
171{
172 if ((val & 0xFFFFFF00) == 0) {
173 return mByteToHex[val & 0xFF];
174 } else if ((val & 0xFFFF0000) == 0) {
175 return mByteToHex[val >> 8 & 0xFF] +
176 mByteToHex[val & 0xFF];
177 } else if ((val & 0xFF000000) == 0) {
178 return mByteToHex[val >> 16 & 0xFF] +
179 mByteToHex[val >> 8 & 0xFF] +
180 mByteToHex[val & 0xFF];
181 }
182
183 return mByteToHex[val >> 24 & 0xFF] +
184 mByteToHex[val >> 16 & 0xFF] +
185 mByteToHex[val >> 8 & 0xFF] +
186 mByteToHex[val & 0xFF];
187}
188
189const std::string HexUtil::toHex(const uint64_t val)
190{
191 if ((val & 0xFFFFFFFFFFFFFF00L) == 0) {
192 return mByteToHex[(int) (val & 0xFF)];
193 } else if ((val & 0xFFFFFFFFFFFF0000L) == 0) {
194 return mByteToHex[(int) (val >> 8 & 0xFF)] +
195 mByteToHex[(int) (val & 0xFF)];
196 } else if ((val & 0xFFFFFFFFFF000000L) == 0) {
197 return mByteToHex[(int) (val >> 16 & 0xFF)] +
198 mByteToHex[(int) (val >> 8 & 0xFF)] +
199 mByteToHex[(int) (val & 0xFF)];
200 } else if ((val & 0xFFFFFFFF00000000L) == 0) {
201 return mByteToHex[(int) (val >> 24 & 0xFF)] +
202 mByteToHex[(int) (val >> 16 & 0xFF)] +
203 mByteToHex[(int) (val >> 8 & 0xFF)] +
204 mByteToHex[(int) (val & 0xFF)];
205 } else if ((val & 0xFFFFFF0000000000L) == 0) {
206 return mByteToHex[(int) (val >> 32 & 0xFF)] +
207 mByteToHex[(int) (val >> 24 & 0xFF)] +
208 mByteToHex[(int) (val >> 16 & 0xFF)] +
209 mByteToHex[(int) (val >> 8 & 0xFF)] +
210 mByteToHex[(int) (val & 0xFF)];
211 } else if ((val & 0xFFFF000000000000L) == 0) {
212 return mByteToHex[(int) (val >> 40 & 0xFF)] +
213 mByteToHex[(int) (val >> 32 & 0xFF)] +
214 mByteToHex[(int) (val >> 24 & 0xFF)] +
215 mByteToHex[(int) (val >> 16 & 0xFF)] +
216 mByteToHex[(int) (val >> 8 & 0xFF)] +
217 mByteToHex[(int) (val & 0xFF)];
218 } else if ((val & 0xFF00000000000000L) == 0) {
219 return mByteToHex[(int) (val >> 48 & 0xFF)] +
220 mByteToHex[(int) (val >> 40 & 0xFF)] +
221 mByteToHex[(int) (val >> 32 & 0xFF)] +
222 mByteToHex[(int) (val >> 24 & 0xFF)] +
223 mByteToHex[(int) (val >> 16 & 0xFF)] +
224 mByteToHex[(int) (val >> 8 & 0xFF)] +
225 mByteToHex[(int) (val & 0xFF)];
226 }
227
228 return mByteToHex[(int) (val >> 56 & 0xFF)] +
229 mByteToHex[(int) (val >> 48 & 0xFF)] +
230 mByteToHex[(int) (val >> 40 & 0xFF)] +
231 mByteToHex[(int) (val >> 32 & 0xFF)] +
232 mByteToHex[(int) (val >> 24 & 0xFF)] +
233 mByteToHex[(int) (val >> 16 & 0xFF)] +
234 mByteToHex[(int) (val >> 8 & 0xFF)] +
235 mByteToHex[(int) (val & 0xFF)];
236}
237
238}
239}
240}
static uint32_t toInt(const std::string &hex)
Definition: HexUtil.cpp:121
static uint64_t toLong(const std::string &hex)
Definition: HexUtil.cpp:133
static const std::vector< uint8_t > toByteArray(const std::string &hex)
Definition: HexUtil.cpp:81
static const std::string toHex(const std::vector< uint8_t > &tab)
Definition: HexUtil.cpp:145
static bool isValid(const std::string &hex)
Definition: HexUtil.cpp:66
static uint8_t toByte(const std::string &hex)
Definition: HexUtil.cpp:97
static uint16_t toShort(const std::string &hex)
Definition: HexUtil.cpp:109