29const std::vector<std::string> ByteArrayUtil::mByteToHex = {
30 "00",
"01",
"02",
"03",
"04",
"05",
"06",
"07",
"08",
"09",
"0A",
"0B",
"0C",
"0D",
"0E",
"0F",
31 "10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"1A",
"1B",
"1C",
"1D",
"1E",
"1F",
32 "20",
"21",
"22",
"23",
"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",
"3C",
"3D",
"3E",
"3F",
34 "40",
"41",
"42",
"43",
"44",
"45",
"46",
"47",
"48",
"49",
"4A",
"4B",
"4C",
"4D",
"4E",
"4F",
35 "50",
"51",
"52",
"53",
"54",
"55",
"56",
"57",
"58",
"59",
"5A",
"5B",
"5C",
"5D",
"5E",
"5F",
36 "60",
"61",
"62",
"63",
"64",
"65",
"66",
"67",
"68",
"69",
"6A",
"6B",
"6C",
"6D",
"6E",
"6F",
37 "70",
"71",
"72",
"73",
"74",
"75",
"76",
"77",
"78",
"79",
"7A",
"7B",
"7C",
"7D",
"7E",
"7F",
38 "80",
"81",
"82",
"83",
"84",
"85",
"86",
"87",
"88",
"89",
"8A",
"8B",
"8C",
"8D",
"8E",
"8F",
39 "90",
"91",
"92",
"93",
"94",
"95",
"96",
"97",
"98",
"99",
"9A",
"9B",
"9C",
"9D",
"9E",
"9F",
40 "A0",
"A1",
"A2",
"A3",
"A4",
"A5",
"A6",
"A7",
"A8",
"A9",
"AA",
"AB",
"AC",
"AD",
"AE",
"AF",
41 "B0",
"B1",
"B2",
"B3",
"B4",
"B5",
"B6",
"B7",
"B8",
"B9",
"BA",
"BB",
"BC",
"BD",
"BE",
"BF",
42 "C0",
"C1",
"C2",
"C3",
"C4",
"C5",
"C6",
"C7",
"C8",
"C9",
"CA",
"CB",
"CC",
"CD",
"CE",
"CF",
43 "D0",
"D1",
"D2",
"D3",
"D4",
"D5",
"D6",
"D7",
"D8",
"D9",
"DA",
"DB",
"DC",
"DD",
"DE",
"DF",
44 "E0",
"E1",
"E2",
"E3",
"E4",
"E5",
"E6",
"E7",
"E8",
"E9",
"EA",
"EB",
"EC",
"ED",
"EE",
"EF",
45 "F0",
"F1",
"F2",
"F3",
"F4",
"F5",
"F6",
"F7",
"F8",
"F9",
"FA",
"FB",
"FC",
"FD",
"FE",
"FF"
48const std::vector<uint8_t> ByteArrayUtil::mHexToNibble = {
49 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
50 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 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 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
53 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 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, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 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 0xFF, 0xFF, 0xFF, 0xFF, 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, 0xFF, 0xFF, 0xFF, 0xFF,
64 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
69 if (hex.length() == 0 || hex.length() % 2 != 0) {
73 for (
int i = 0; i < static_cast<int>(hex.length()); i++) {
74 if (
static_cast<char>(mHexToNibble[hex.at(i)]) < 0) {
84 if (hex.length() % 2 != 0) {
94 std::vector<uint8_t> tab(hex.length() / 2);
96 for (
int i = 0; i < (int)hex.length(); i += 2) {
97 tab[i / 2] = ((mHexToNibble[hex.at(i)] << 4) + (mHexToNibble[hex.at(i + 1)] & 0xFF));
107 return ((mHexToNibble[hex.at(0)] << 4) + (mHexToNibble[hex.at(1)] & 0xFF));
113 .
isEqual(hex.length() % 2, 0,
"hex")
114 .
isTrue(hex.length() <= 4,
"hex");
117 for (
int i = 0; i < static_cast<int>(hex.length()); i++) {
119 val |= (mHexToNibble[hex.at(i)] & 0xFF);
128 .
isEqual(hex.length() % 2, 0,
"hex")
129 .
isTrue(hex.length() <= 8,
"hex");
131 for (
int i = 0; i < static_cast<int>(hex.length()); i++) {
133 val |= (mHexToNibble[hex.at(i)] & 0xFF);
142 .
isEqual(hex.length() % 2, 0,
"hex")
143 .
isTrue(hex.length() <= 16,
"hex");
145 for (
int i = 0; i < static_cast<int>(hex.length()); i++) {
147 val |= (mHexToNibble[hex.at(i)] & 0xFF);
159 auto sb = std::make_shared<StringBuilder>();
160 for (
const auto& b : tab) {
161 sb->append(mByteToHex[b & 0xFF]);
164 return sb->toString();
173 auto sb = std::make_shared<StringBuilder>();
174 for (
const auto& b : tab) {
175 sb->append(mByteToHex[b & 0xFF]);
178 return sb->toString();
183 return mByteToHex[val & 0xFF];
188 if ((val & 0xFF00) == 0) {
189 return mByteToHex[val & 0xFF];
192 return mByteToHex[val >> 8 & 0xFF] +
193 mByteToHex[val & 0xFF];
199 if ((val & 0xFFFFFF00) == 0) {
200 return mByteToHex[val & 0xFF];
202 }
else if ((val & 0xFFFF0000) == 0) {
203 return mByteToHex[val >> 8 & 0xFF] +
204 mByteToHex[val & 0xFF];
206 }
else if ((val & 0xFF000000) == 0) {
207 return mByteToHex[val >> 16 & 0xFF] +
208 mByteToHex[val >> 8 & 0xFF] +
209 mByteToHex[val & 0xFF];
212 return mByteToHex[val >> 24 & 0xFF] +
213 mByteToHex[val >> 16 & 0xFF] +
214 mByteToHex[val >> 8 & 0xFF] +
215 mByteToHex[val & 0xFF];
221 if ((val & 0xFFFFFFFFFFFFFF00L) == 0) {
222 return mByteToHex[(int) (val & 0xFF)];
224 }
else if ((val & 0xFFFFFFFFFFFF0000L) == 0) {
225 return mByteToHex[(int) (val >> 8 & 0xFF)] +
226 mByteToHex[(int) (val & 0xFF)];
228 }
else if ((val & 0xFFFFFFFFFF000000L) == 0) {
229 return mByteToHex[(int) (val >> 16 & 0xFF)] +
230 mByteToHex[(int) (val >> 8 & 0xFF)] +
231 mByteToHex[(int) (val & 0xFF)];
233 }
else if ((val & 0xFFFFFFFF00000000L) == 0) {
234 return mByteToHex[(int) (val >> 24 & 0xFF)] +
235 mByteToHex[(int) (val >> 16 & 0xFF)] +
236 mByteToHex[(int) (val >> 8 & 0xFF)] +
237 mByteToHex[(int) (val & 0xFF)];
239 }
else if ((val & 0xFFFFFF0000000000L) == 0) {
240 return mByteToHex[(int) (val >> 32 & 0xFF)] +
241 mByteToHex[(int) (val >> 24 & 0xFF)] +
242 mByteToHex[(int) (val >> 16 & 0xFF)] +
243 mByteToHex[(int) (val >> 8 & 0xFF)] +
244 mByteToHex[(int) (val & 0xFF)];
246 }
else if ((val & 0xFFFF000000000000L) == 0) {
247 return mByteToHex[(int) (val >> 40 & 0xFF)] +
248 mByteToHex[(int) (val >> 32 & 0xFF)] +
249 mByteToHex[(int) (val >> 24 & 0xFF)] +
250 mByteToHex[(int) (val >> 16 & 0xFF)] +
251 mByteToHex[(int) (val >> 8 & 0xFF)] +
252 mByteToHex[(int) (val & 0xFF)];
254 }
else if ((val & 0xFF00000000000000L) == 0) {
255 return mByteToHex[(int) (val >> 48 & 0xFF)] +
256 mByteToHex[(int) (val >> 40 & 0xFF)] +
257 mByteToHex[(int) (val >> 32 & 0xFF)] +
258 mByteToHex[(int) (val >> 24 & 0xFF)] +
259 mByteToHex[(int) (val >> 16 & 0xFF)] +
260 mByteToHex[(int) (val >> 8 & 0xFF)] +
261 mByteToHex[(int) (val & 0xFF)];
264 return mByteToHex[(int) (val >> 56 & 0xFF)] +
265 mByteToHex[(int) (val >> 48 & 0xFF)] +
266 mByteToHex[(int) (val >> 40 & 0xFF)] +
267 mByteToHex[(int) (val >> 32 & 0xFF)] +
268 mByteToHex[(int) (val >> 24 & 0xFF)] +
269 mByteToHex[(int) (val >> 16 & 0xFF)] +
270 mByteToHex[(int) (val >> 8 & 0xFF)] +
271 mByteToHex[(int) (val & 0xFF)];
275void ByteArrayUtil::checkBytesToIntConversionParams(
const int size,
276 const std::vector<uint8_t>& bytes,
281 }
else if ((
int)bytes.size() < offset + size) {
283 }
else if (offset < 0) {
290 checkBytesToIntConversionParams(2, bytes, offset);
292 return (bytes[offset] & 0xFF) << 8 | (bytes[offset + 1] & 0xFF);
297 checkBytesToIntConversionParams(2, bytes, offset);
299 if (
static_cast<int8_t
>(bytes[offset]) >= 0) {
301 return (bytes[offset] & 0xFF) << 8 | (bytes[offset + 1] & 0xFF);
304 return 0xFFFF0000 | (bytes[offset] & 0xFF) << 8 | (bytes[offset + 1] & 0xFF);
310 checkBytesToIntConversionParams(3, bytes, offset);
312 return ((
static_cast<int>(bytes[offset ])) << 16) +
313 ((
static_cast<int>(bytes[offset + 1])) << 8) +
314 (
static_cast<int>(bytes[offset + 2]));
319 checkBytesToIntConversionParams(3, bytes, offset);
321 if (
static_cast<int8_t
>(bytes[offset]) >= 0) {
323 return (bytes[offset ] & 0xFF) << 16 |
324 (bytes[offset + 1] & 0xFF) << 8 |
325 (bytes[offset + 2] & 0xFF);
329 (bytes[offset ] & 0xFF) << 16 |
330 (bytes[offset + 1] & 0xFF) << 8 |
331 (bytes[offset + 2] & 0xFF);
337 checkBytesToIntConversionParams(4, bytes, offset);
339 return (bytes[offset ] & 0xFF) << 24 |
340 (bytes[offset + 1] & 0xFF) << 16 |
341 (bytes[offset + 2] & 0xFF) << 8 |
342 (bytes[offset + 3] & 0xFF);
static Assert & getInstance()
Assert & notEmpty(const std::string &obj, const std::string &name)
Assert & isTrue(const bool condition, const std::string &name)
Assert & isEqual(const size_t number, const size_t value, const std::string &name)
static bool isValidHexString(const std::string &hex)
static const std::string normalizeHexString(const std::string &hex)
static uint8_t hexToByte(const std::string &hex)
static uint64_t hexToLong(const std::string &hex)
static uint32_t hexToInt(const std::string &hex)
static int threeBytesToInt(const std::vector< uint8_t > &bytes, const int offset)
static int fourBytesToInt(const std::vector< uint8_t > &bytes, const int offset)
static int twoBytesSignedToInt(const std::vector< uint8_t > &bytes, const int offset)
static uint16_t hexToShort(const std::string &hex)
static std::string toHex(const std::vector< char > &tab)
static std::vector< uint8_t > fromHex(const std::string &hex)
static int threeBytesSignedToInt(const std::vector< uint8_t > &bytes, const int offset)
static int twoBytesToInt(const std::vector< uint8_t > &bytes, const int offset)