signed_test.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include <stdint.h>
  2. #include <stdio.h>
  3. #include <inttypes.h>
  4. /*
  5. 0x00000000 0xFFFFFFFF
  6. 0xFFFFFFFF 0xFFFFFFFF
  7. 0xFFFFFFFE 0xFFFEFFFE
  8. 0x00020304 0x03080306
  9. */
  10. //uint32_t fletcher32(uint16_t const *data, size_t words)
  11. uint32_t fletcher32(unsigned short const *data, size_t words)
  12. {
  13. printf("checksum calculation...\n");
  14. // 1 word = 2 Bytes
  15. uint32_t sum1 = 0xffff, sum2 = 0xffff;
  16. while (words) {
  17. unsigned tlen = words > 359 ? 359 : words;
  18. words -= tlen;
  19. do {
  20. //sum2 += sum1 += *data++;
  21. printf("adding NBO: 0x%.4" PRIX32 "\n", htons(*data));
  22. printf("adding HBO: 0x%.4" PRIX32 "\n", *data);
  23. //sum1 += *data;
  24. sum1 += htons(*data);
  25. sum2 += sum1;
  26. data += 1;
  27. //printf("---\n");
  28. } while (--tlen);
  29. sum1 = (sum1 & 0xffff) + (sum1 >> 16);
  30. sum2 = (sum2 & 0xffff) + (sum2 >> 16);
  31. }
  32. /* Second reduction step to reduce sums to 16 bits */
  33. sum1 = (sum1 & 0xffff) + (sum1 >> 16);
  34. sum2 = (sum2 & 0xffff) + (sum2 >> 16);
  35. return sum2 << 16 | sum1;
  36. }
  37. int main() {
  38. uint32_t ui, sum;
  39. ui = htonl((uint32_t)0x00020304);
  40. ui = htonl((uint32_t)0xFFFFFF00);
  41. ui = htonl((uint32_t)0x00000000);
  42. //ui = htonl((uint32_t)0x00000002);
  43. ui = htonl((uint32_t)0x02000000);
  44. //ui = htonl((uint32_t)0x00000000);
  45. //ui = htonl((uint32_t)0xFFFFFFFE);
  46. unsigned short const *data = (unsigned short*)&ui;
  47. unsigned char const *data2 = (char*)&ui;
  48. printf("1st half: 0x%.4" PRIX32 "\n", *data);
  49. printf("2nd half: 0x%.4" PRIX32 "\n", *(data+1));
  50. printf("0x%.4" PRIX32 "\n", *data2);
  51. printf("0x%.4" PRIX32 "\n", *(data2+1));
  52. printf("0x%.4" PRIX32 "\n", *(data2+2));
  53. printf("0x%.4" PRIX32 "\n", *(data2+3));
  54. sum = fletcher32(data, 2);
  55. printf("0x%.8" PRIX32 "\n", sum);
  56. }