YPC  0.2.0
endian.h
1 #pragma once
2 #include <algorithm>
3 #include <cstddef>
4 #include <cstdint>
5 
6 namespace ypc {
7 namespace utc {
8 
9 template <typename Bytes> void change_pubkey_endian(Bytes &pkey) {
10  size_t step = pkey.size() / 2;
11  for (size_t i = 0; i < pkey.size(); i += step) {
12  for (size_t j = 0; j < step / 2; j++) {
13  std::swap(pkey[i + j], pkey[i + step - 1 - j]);
14  }
15  }
16 }
17 
18 template <typename T> void change_pubkey_endian(T *pkey, size_t pkey_size) {
19  static_assert(sizeof(T) == 1, "change_endian is only for 1 byte type");
20  size_t step = pkey_size / 2;
21  for (size_t i = 0; i < pkey_size; i += step) {
22  for (size_t j = 0; j < step / 2; j++) {
23  std::swap(pkey[i + j], pkey[i + step - 1 - j]);
24  }
25  }
26 }
27 
28 template <typename T> void endian_swap(T *pData, int start_index, int length) {
29  static_assert(sizeof(T) == 1, "endian_swap is only for 1 byte type");
30  int i, cnt, end, start;
31  cnt = length / 2;
32  start = start_index;
33  end = start_index + length - 1;
34  T tmp;
35  for (i = 0; i < cnt; i++) {
36  tmp = pData[start + i];
37  pData[start + i] = pData[end - i];
38  pData[end - i] = tmp;
39  }
40 }
41 template <typename Bytes> void endian_swap(Bytes &data) {
42  endian_swap(data.data(), 0, data.size());
43 }
44 } // namespace utc
45 } // namespace ypc