Verify bittorrent .torrent metainfo files.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

48 lignes
1.6KB

  1. #include <stdio.h>
  2. #include "util.h"
  3. #define B_IN_KiB 1024ull
  4. #define B_IN_MiB B_IN_KiB * 1024
  5. #define B_IN_GiB B_IN_MiB * 1024
  6. #define B_IN_TiB B_IN_GiB * 1024
  7. #define B_IN_KB 1000ull
  8. #define B_IN_MB B_IN_KB * 1000
  9. #define B_IN_GB B_IN_MB * 1000
  10. #define B_IN_TB B_IN_GB * 1000
  11. int util_byte2human(long int bytes, int binary, int precision, char* out, size_t out_len) {
  12. #define S_CONV(t) ((binary) ? (B_IN_##t##iB) : (B_IN_##t##B))
  13. #define S_LESS(t) (bytes < S_CONV(t))
  14. #define S_SUFFIX(t) ((binary) ? (t "iB") : (t "B"))
  15. if (!out)
  16. return -1;
  17. int written;
  18. if (S_LESS(K))
  19. written = snprintf(out, out_len, "%ld B", bytes);
  20. else if (S_LESS(M))
  21. written = snprintf(out, out_len, "%.*f %s", (precision == -1) ? 0 : precision, bytes / (double)(S_CONV(K)), S_SUFFIX("K"));
  22. else if (S_LESS(G))
  23. written = snprintf(out, out_len, "%.*f %s", (precision == -1) ? 1 : precision, bytes / (double)(S_CONV(M)), S_SUFFIX("M"));
  24. else if (S_LESS(T))
  25. written = snprintf(out, out_len, "%.*f %s", (precision == -1) ? 2 : precision, bytes / (double)(S_CONV(G)), S_SUFFIX("G"));
  26. else
  27. written = snprintf(out, out_len, "%.*f %s", (precision == -1) ? 3 : precision, bytes / (double)(S_CONV(T)), S_SUFFIX("T"));
  28. return (written >= out_len) ? -1 : written;
  29. #undef S_SUFFIX
  30. #undef S_LESS
  31. #undef S_CONV
  32. }
  33. void util_byte2hex(const unsigned char* bytes, int bytes_len, int uppercase, char* out) {
  34. const char* hex = (uppercase) ? "0123456789ABCDEF" : "0123456789abcdef";
  35. for (int i = 0; i < bytes_len; i++) {
  36. *out++ = hex[bytes[i] >> 4];
  37. *out++ = hex[bytes[i] & 0xF];
  38. }
  39. *out = '\0';
  40. }