14#include "keyple/core/util/HexUtil.hpp"
20#include "keyple/core/util/cpp/exception/StringIndexOutOfBoundsException.hpp"
26using keyple::core::util::cpp::exception::StringIndexOutOfBoundsException;
28const std::vector<std::string> HexUtil::mByteToHex
29 = {
"00",
"01",
"02",
"03",
"04",
"05",
"06",
"07",
"08",
"09",
"0A",
"0B",
30 "0C",
"0D",
"0E",
"0F",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
31 "18",
"19",
"1A",
"1B",
"1C",
"1D",
"1E",
"1F",
"20",
"21",
"22",
"23",
32 "24",
"25",
"26",
"27",
"28",
"29",
"2A",
"2B",
"2C",
"2D",
"2E",
"2F",
33 "30",
"31",
"32",
"33",
"34",
"35",
"36",
"37",
"38",
"39",
"3A",
"3B",
34 "3C",
"3D",
"3E",
"3F",
"40",
"41",
"42",
"43",
"44",
"45",
"46",
"47",
35 "48",
"49",
"4A",
"4B",
"4C",
"4D",
"4E",
"4F",
"50",
"51",
"52",
"53",
36 "54",
"55",
"56",
"57",
"58",
"59",
"5A",
"5B",
"5C",
"5D",
"5E",
"5F",
37 "60",
"61",
"62",
"63",
"64",
"65",
"66",
"67",
"68",
"69",
"6A",
"6B",
38 "6C",
"6D",
"6E",
"6F",
"70",
"71",
"72",
"73",
"74",
"75",
"76",
"77",
39 "78",
"79",
"7A",
"7B",
"7C",
"7D",
"7E",
"7F",
"80",
"81",
"82",
"83",
40 "84",
"85",
"86",
"87",
"88",
"89",
"8A",
"8B",
"8C",
"8D",
"8E",
"8F",
41 "90",
"91",
"92",
"93",
"94",
"95",
"96",
"97",
"98",
"99",
"9A",
"9B",
42 "9C",
"9D",
"9E",
"9F",
"A0",
"A1",
"A2",
"A3",
"A4",
"A5",
"A6",
"A7",
43 "A8",
"A9",
"AA",
"AB",
"AC",
"AD",
"AE",
"AF",
"B0",
"B1",
"B2",
"B3",
44 "B4",
"B5",
"B6",
"B7",
"B8",
"B9",
"BA",
"BB",
"BC",
"BD",
"BE",
"BF",
45 "C0",
"C1",
"C2",
"C3",
"C4",
"C5",
"C6",
"C7",
"C8",
"C9",
"CA",
"CB",
46 "CC",
"CD",
"CE",
"CF",
"D0",
"D1",
"D2",
"D3",
"D4",
"D5",
"D6",
"D7",
47 "D8",
"D9",
"DA",
"DB",
"DC",
"DD",
"DE",
"DF",
"E0",
"E1",
"E2",
"E3",
48 "E4",
"E5",
"E6",
"E7",
"E8",
"E9",
"EA",
"EB",
"EC",
"ED",
"EE",
"EF",
49 "F0",
"F1",
"F2",
"F3",
"F4",
"F5",
"F6",
"F7",
"F8",
"F9",
"FA",
"FB",
50 "FC",
"FD",
"FE",
"FF"};
52const std::vector<uint8_t> HexUtil::mHexToNibble = {
53 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,
55 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,
57 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF,
58 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
59 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,
61 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
62 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
63 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
64 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
65 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
66 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
67 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
68 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
69 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
70 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
71 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
72 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
73 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
74 0xFF, 0xFF, 0xFF, 0xFF,
82HexUtil::isValid(
const std::string& hex)
84 if (hex.length() == 0 || hex.length() % 2 != 0) {
88 for (
int i = 0; i < static_cast<int>(hex.size()); i++) {
89 if (mHexToNibble[hex.at(i)] == 0xFF) {
97const std::vector<uint8_t>
98HexUtil::toByteArray(
const std::string& hex)
100 std::vector<uint8_t> tab(hex.size() / 2);
102 if (hex.length() % 2) {
103 throw StringIndexOutOfBoundsException(
"string has odd length");
106 for (
int i = 0; i < static_cast<int>(hex.length()); i += 2) {
108 = ((mHexToNibble[hex.at(i)] << 4)
109 + (mHexToNibble[hex.at(i + 1)] & 0xFF));
116HexUtil::toByte(
const std::string& hex)
120 for (
int i = 0; i < static_cast<int>(hex.length()); i++) {
122 val |= (mHexToNibble[hex.at(i)] & 0xFF);
129HexUtil::toShort(
const std::string& hex)
133 for (
int i = 0; i < static_cast<int>(hex.length()); i++) {
135 val |= (mHexToNibble[hex.at(i)] & 0xFF);
142HexUtil::toInt(
const std::string& hex)
146 for (
int i = 0; i < static_cast<int>(hex.length()); i++) {
148 val |= (mHexToNibble[hex.at(i)] & 0xFF);
155HexUtil::toLong(
const std::string& hex)
159 for (
int i = 0; i < static_cast<int>(hex.length()); i++) {
161 val |= (mHexToNibble[hex.at(i)] & 0xFF);
168HexUtil::toHex(
const std::vector<uint8_t>& tab)
170 std::stringstream ss;
172 for (
const auto& b : tab) {
173 ss << (mByteToHex[b & 0xFF]);
180HexUtil::toHex(
const uint8_t val)
182 return mByteToHex[val & 0xFF];
186HexUtil::toHex(
const uint16_t val)
188 if ((val & 0xFF00) == 0) {
189 return mByteToHex[val & 0xFF];
192 return mByteToHex[val >> 8 & 0xFF] + mByteToHex[val & 0xFF];
196HexUtil::toHex(
const uint32_t val)
198 if ((val & 0xFFFFFF00) == 0) {
199 return mByteToHex[val & 0xFF];
200 }
else if ((val & 0xFFFF0000) == 0) {
201 return mByteToHex[val >> 8 & 0xFF] + mByteToHex[val & 0xFF];
202 }
else if ((val & 0xFF000000) == 0) {
203 return mByteToHex[val >> 16 & 0xFF] + mByteToHex[val >> 8 & 0xFF]
204 + mByteToHex[val & 0xFF];
207 return mByteToHex[val >> 24 & 0xFF] + mByteToHex[val >> 16 & 0xFF]
208 + mByteToHex[val >> 8 & 0xFF] + mByteToHex[val & 0xFF];
212HexUtil::toHex(
const uint64_t val)
214 if ((val & 0xFFFFFFFFFFFFFF00L) == 0) {
215 return mByteToHex[
static_cast<int>((val & 0xFF))];
216 }
else if ((val & 0xFFFFFFFFFFFF0000L) == 0) {
217 return mByteToHex[
static_cast<int>((val >> 8 & 0xFF))]
218 + mByteToHex[
static_cast<int>((val & 0xFF))];
219 }
else if ((val & 0xFFFFFFFFFF000000L) == 0) {
220 return mByteToHex[
static_cast<int>((val >> 16 & 0xFF))]
221 + mByteToHex[
static_cast<int>((val >> 8 & 0xFF))]
222 + mByteToHex[
static_cast<int>((val & 0xFF))];
223 }
else if ((val & 0xFFFFFFFF00000000L) == 0) {
224 return mByteToHex[
static_cast<int>((val >> 24 & 0xFF))]
225 + mByteToHex[
static_cast<int>((val >> 16 & 0xFF))]
226 + mByteToHex[
static_cast<int>((val >> 8 & 0xFF))]
227 + mByteToHex[
static_cast<int>((val & 0xFF))];
228 }
else if ((val & 0xFFFFFF0000000000L) == 0) {
229 return mByteToHex[
static_cast<int>((val >> 32 & 0xFF))]
230 + mByteToHex[
static_cast<int>((val >> 24 & 0xFF))]
231 + mByteToHex[
static_cast<int>((val >> 16 & 0xFF))]
232 + mByteToHex[
static_cast<int>((val >> 8 & 0xFF))]
233 + mByteToHex[
static_cast<int>((val & 0xFF))];
234 }
else if ((val & 0xFFFF000000000000L) == 0) {
235 return mByteToHex[
static_cast<int>((val >> 40 & 0xFF))]
236 + mByteToHex[
static_cast<int>((val >> 32 & 0xFF))]
237 + mByteToHex[
static_cast<int>((val >> 24 & 0xFF))]
238 + mByteToHex[
static_cast<int>((val >> 16 & 0xFF))]
239 + mByteToHex[
static_cast<int>((val >> 8 & 0xFF))]
240 + mByteToHex[
static_cast<int>((val & 0xFF))];
241 }
else if ((val & 0xFF00000000000000L) == 0) {
242 return mByteToHex[
static_cast<int>((val >> 48 & 0xFF))]
243 + mByteToHex[
static_cast<int>((val >> 40 & 0xFF))]
244 + mByteToHex[
static_cast<int>((val >> 32 & 0xFF))]
245 + mByteToHex[
static_cast<int>((val >> 24 & 0xFF))]
246 + mByteToHex[
static_cast<int>((val >> 16 & 0xFF))]
247 + mByteToHex[
static_cast<int>((val >> 8 & 0xFF))]
248 + mByteToHex[
static_cast<int>((val & 0xFF))];
251 return mByteToHex[
static_cast<int>((val >> 56 & 0xFF))]
252 + mByteToHex[
static_cast<int>((val >> 48 & 0xFF))]
253 + mByteToHex[
static_cast<int>((val >> 40 & 0xFF))]
254 + mByteToHex[
static_cast<int>((val >> 32 & 0xFF))]
255 + mByteToHex[
static_cast<int>((val >> 24 & 0xFF))]
256 + mByteToHex[
static_cast<int>((val >> 16 & 0xFF))]
257 + mByteToHex[
static_cast<int>((val >> 8 & 0xFF))]
258 + mByteToHex[
static_cast<int>((val & 0xFF))];