I will write one simple function:
inline uint64_t fourCh2uint64 (const unsigned char charArr[4]) {
return uint64_t(charArr[6]) << 56 | uint64_t (charArr[7]) << 48 |
uint64_t(charArr[4]) << 40 | uint64_t (charArr[5]) << 32 |
uint64_t(charArr[2]) << 24 | uint64_t (charArr[3]) << 16 |
uint64_t(charArr[0]) << 8 | uint64_t (charArr[1]);
}
That is for single uint64
. For 4 of them, you can use:
char chArr[32] = {...}
uint64_t uintArr[4];
uintArr[0] = fourCh2uint64 (chArr);
uintArr[1] = fourCh2uint64 (chArr + 8);
uintArr[2] = fourCh2uint64 (chArr + 16);
uintArr[3] = fourCh2uint64 (chArr + 24);
Here is entire program:
#include <iostream>
inline uint64_t fourCh2uint64 (const unsigned char[4]);
int main (void) {
unsigned char chArr [32] = {
0x1a, 0x2a, 0x3a, 0x4a, 0x5a, 0x06a, 0x7a, 0x8a,
0x1b, 0x2b, 0x3b, 0x4b, 0x5b, 0x6b, 0x7b, 0x8b,
0x1c, 0x2c, 0x3c, 0x4c, 0x5c, 0x6c, 0x7c, 0x8c,
0x1d, 0x2d, 0x3d, 0x4d, 0x5d, 0x6d, 0x7d, 0x8d
};
uint64_t uintArr[4];
uintArr[0] = fourCh2uint64 (chArr);
uintArr[1] = fourCh2uint64 (chArr + 8);
uintArr[2] = fourCh2uint64 (chArr + 16);
uintArr[3] = fourCh2uint64 (chArr + 24);
std::cout << std::hex << uintArr[0] << " " << uintArr[1] << " ";
std::cout << std::hex << uintArr[2] << " " << uintArr[3] << "\n";
return 0;
}
inline uint64_t fourCh2uint64 (const unsigned char charArr[4]) {
return uint64_t(charArr[0]) << 56 | uint64_t (charArr[1]) << 48 |
uint64_t(charArr[2]) << 40 | uint64_t (charArr[3]) << 32 |
uint64_t(charArr[4]) << 24 | uint64_t (charArr[5]) << 16 |
uint64_t(charArr[6]) << 8 | uint64_t (charArr[7]);
}
and output:
1a2a3a4a5a6a7a8a 1b2b3b4b5b6b7b8b 1c2c3c4c5c6c7c8c 1d2d3d4d5d6d7d8d
EDIT:
to avoid UB with shifting updated my funciton