byte.template.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #ifndef AFUN_BYTE_TEMPLATE_H
  2. #define AFUN_BYTE_TEMPLATE_H
  3. #include "byte.h"
  4. namespace aFuntool {
  5. /**
  6. * 写入一个整数
  7. * @tparam T 整数类型
  8. * @param file FILE 结构体
  9. * @param num 整数
  10. * @return
  11. */
  12. template<typename T>
  13. bool byteWriteInt(FILE *file, T num){
  14. if (endian != save_as) {
  15. const size_t len = sizeof(T) / sizeof(uint8_t); // NOLINT 允许 size(T) / size(T)
  16. union {
  17. T a;//元素a,占2个字节
  18. uint8_t b[len];//元素b,占1个字节,b在内存中的地址为a最低字节的地址
  19. } in{.a = num}, out{};
  20. for (size_t i = 0; i < len; i++)
  21. out.b[len - i] = in.b[i]; // 大小端序转换
  22. num = out.a;
  23. }
  24. return fwrite(&num, sizeof(T), 1, file) == 1;
  25. }
  26. /**
  27. * 读取一个整数
  28. * @tparam T 整数类型
  29. * @param file FILE 结构体
  30. * @param num 整数
  31. * @return
  32. */
  33. template<typename T>
  34. bool byteReadInt(FILE *file, T *num){
  35. size_t re = fread(num, sizeof(T), 1, file);
  36. if (endian != save_as) {
  37. const size_t len = sizeof(T) / sizeof(uint8_t); // NOLINT 允许 size(T) / size(T)
  38. union {
  39. T a;//元素a,占2个字节
  40. uint8_t b[len];//元素b,占1个字节,b在内存中的地址为a最低字节的地址
  41. } in{.a = *num}, out{};
  42. for (size_t i = 0; i < len; i++)
  43. out.b[len - i] = in.b[i]; // 大小端序转换
  44. *num = out.a;
  45. }
  46. return re == 1;
  47. }
  48. }
  49. #endif //AFUN_BYTE_TEMPLATE_H