1
0

tool_byte.template.h 1.8 KB

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