fork download
  1. #include <stdio.h>
  2. #include <stdint.h>
  3.  
  4. void decode_bch_bin(uint16_t enc, uint16_t* dec);
  5. void decodebch_bi1(int *bits, int *decbits);
  6. uint32_t getbitu(uint8_t* buff, uint32_t pos, uint32_t len);
  7. void bits2byte(int *bits, int nbits, int nbin, int right, uint8_t *bin);
  8.  
  9. union bch_reg{
  10. uint8_t val;
  11. struct {
  12. uint8_t b0:1;
  13. uint8_t b1:1;
  14. uint8_t b2:1;
  15. uint8_t b3:1;
  16. } bits;
  17. };
  18.  
  19. int main(void) {
  20. int32_t bits[15] = {1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1};
  21. int32_t bits_res[15];
  22. uint16_t dec = 0, bin = 0x5555;
  23. decodebch_bi1(bits, bits_res);
  24. decode_bch_bin(bin , &dec);
  25. {
  26. int i = 0;
  27. for(i = 0; i < 15; i++) {
  28. printf(" %d",bits_res[i]);
  29. }
  30. }
  31. printf("\n%x",dec);
  32. return 0;
  33. }
  34.  
  35. void decode_bch_bin(uint16_t enc, uint16_t* dec)
  36. {
  37. union bch_reg reg;
  38. uint8_t i, bit;
  39. uint16_t err[15] = {0, 1, 2, 16, 4, 256, 32, 1024, 8, 16384, 512, 128,
  40. 64, 8192, 2048, 4096};
  41. /* see Table 5.2 */
  42. uint8_t ind = 0;
  43.  
  44. /* BCH decoding (Fig 5-4) */
  45. for (i = 0; i < 15; i++) {
  46. bit = reg.bits.b3;
  47. reg.bits.b3 = reg.bits.b2;
  48. reg.bits.b2 = reg.bits.b1;
  49. reg.bits.b1 = reg.bits.b0;
  50. reg.bits.b0 = (enc & (1 << i))^bit;
  51. reg.bits.b1 ^= bit;
  52. }
  53. printf("reg val = %u\n", reg.val);
  54. /*error correction*/
  55. enc ^= err[reg.val];
  56.  
  57. *dec = enc;
  58. }
  59.  
  60.  
  61. void decodebch_bi1(int *bits, int *decbits)
  62. {
  63. int i,bit,err,reg[4]={1,1,1,1};
  64. int errind[15]={14,13,10,12,6,9,4,11,0,5,7,8,1,3,2}; /* see Table 5.2 */
  65. uint8_t bin;
  66.  
  67. /* copy input to output */
  68. for (i=0;i<15;i++) decbits[i]=bits[i];
  69.  
  70. /* BCH decoding (Fig 5-4) */
  71. for (i=0;i<15;i++) {
  72. bit=reg[3];
  73. reg[3]=reg[2]; reg[2]=reg[1]; reg[1]=reg[0];
  74. reg[0]=bits[i]*bit;
  75. reg[1]*=bit;
  76. }
  77. /* get error index */
  78. bits2byte(reg,4,1,0,&bin);
  79. printf("bin = %u\n", getbitu(&bin,0,4));
  80. err=errind[getbitu(&bin,0,4)]; /* error index */
  81.  
  82. /* error correction */
  83. if (err>0) decbits[err-1]*=-1;
  84. }
  85.  
  86. void bits2byte(int *bits, int nbits, int nbin, int right, uint8_t *bin)
  87. {
  88. int i,j,rem,bitscpy[8192]={0};
  89. unsigned char b;
  90. rem=8*nbin-nbits;
  91.  
  92. memcpy(&bitscpy[right?rem:0],bits,sizeof(int)*nbits);
  93.  
  94. for (i=0;i<nbin;i++) {
  95. b=0;
  96. for (j=0;j<8;j++) {
  97. b<<=1;
  98. if (bitscpy[i*8+j]<0) b|=0x01; /* -1=>1, 1=>0 */
  99. }
  100. bin[i]=b;
  101. }
  102. }
  103.  
  104. uint32_t getbitu(uint8_t* buff, uint32_t pos, uint32_t len)
  105. {
  106. uint32_t i, bits=0;
  107. for (i = pos; i < pos + len; i++) {
  108. bits = (bits << 1) + ((buff[i/8] >> (7 - i%8)) & 1u);
  109. }
  110. return bits;
  111. }
Success #stdin #stdout 0s 5304KB
stdin
Standard input is empty
stdout
bin = 7
reg val = 9
 1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1 1
1555