Advertisement
maksim32

hamming

Dec 23rd, 2018
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.79 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <limits.h>
  4.  
  5. #define BUFFER_SIZE (4096 * sizeof(char))
  6. #define INT32_BIT (CHAR_BIT * sizeof(int32_t))
  7. #define IS_POW2(x) ((x & (x - 1)) == 0)
  8.  
  9. uint32_t hamming_encode(const char *src, char *dst, size_t dst_size)
  10. {
  11.     uint32_t result = 0; // 0 - success
  12.     char *ctrl[INT32_BIT], curc, *dst_end = dst + dst_size;
  13.     uint32_t i = 1, q = 0, k = 0;
  14.     while(dst < dst_end)
  15.     {
  16.         if (!IS_POW2(i))
  17.         {
  18.             if ((curc = *src) == '\0') break;
  19.             ++src;
  20.             if (curc == '1' || curc == '0')
  21.             {
  22.                 if (curc == '1') q ^= i;
  23.                 *dst = curc;
  24.             }
  25.             else continue; // ignore invalid symbols
  26.         }
  27.         else ctrl[k++] = dst;
  28.         ++i;
  29.         ++dst;
  30.     }
  31.     for (i = 0; i < k; ++i)
  32.     {
  33.         *ctrl[i] = (q & 1) + '0';
  34.         q >>= 1;
  35.     }
  36.     *dst = '\0';
  37.     if (*src != '\0') result = 1; // 1 - output buffer is small
  38.     return result;
  39. }
  40.  
  41. uint32_t hamming_check(const char *str)
  42. {
  43.     uint32_t i = 1, q = 0;
  44.     for (; *str != '\0'; ++str, ++i)
  45.     {
  46.         if (*str == '1') q ^= i;
  47.     }
  48.     return q; // 0 - success, no errors
  49. }
  50.  
  51. void hamming_decode(char *str)
  52. {
  53.     uint32_t i = 1;
  54.     char *dst = str;
  55.     for (; *str != '\0'; ++str, ++i)
  56.     {
  57.         if (!IS_POW2(i)) *dst++ = *str;
  58.     }
  59.     *dst = '\0';
  60. }
  61.  
  62. int main()
  63. {
  64.     // const char *src = "1110000100";
  65.     char src[BUFFER_SIZE];
  66.     char dst[BUFFER_SIZE];
  67.     uint32_t error_code;
  68.     printf("Enter bit-string to hamming encode/decode:\n");
  69.     fgets(src, BUFFER_SIZE, stdin);
  70.     if ((error_code = hamming_encode(src, dst, BUFFER_SIZE)) == 0)
  71.     {
  72.         printf("%s\n", dst);
  73.         if ((error_code = hamming_check(dst)) == 0)
  74.         {
  75.             printf("Hamming code is valid. Decode...\n");
  76.             hamming_decode(dst);
  77.             printf("%s\n", dst);
  78.         }
  79.         else printf("Hamming code is INVALID. Error code: %d!\n", error_code);
  80.     }
  81.     else fprintf(stderr, "Error: output buffer is small.\n");
  82.     return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement