Advertisement
tjorim

Barcode scanner_Jorim Tielemans

Jan 19th, 2017
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.33 KB | None | 0 0
  1. /**
  2.  * Programma om ingelezen barcodes te decoderen
  3.  *
  4.  * @author Jorim Tielemans
  5.  */
  6.  
  7. #include <stdio.h>
  8.  
  9. typedef enum {BEGIN, MIDDEN, EINDE, BITFLIP, OMGEDRAAID, CLEAR} error;
  10.  
  11. unsigned long long int getalOplossen(unsigned int deel1, unsigned int deel2, unsigned int deel3);
  12. error getalTesten(unsigned int deel1, unsigned int deel2, unsigned int deel3);
  13. int getalDecoderen(unsigned int binair);
  14.  
  15. /*
  16.  * De hoofdfunctie, hier kunnen eventueel andere codes opgevraagd worden aan de gebruiker
  17.  *
  18.  * @return int 0 indien geen errors
  19. */
  20. int main(void)
  21. {
  22.     getalOplossen(0x5324DEA3, 0x62BD5124, 0x74E9D3A5);
  23.     getalOplossen(0x5162C5B7, 0x76BD53AE, 0x42D99B95);
  24.     getalOplossen(0x51AF578D, 0x1A355B3A, 0x66B93B65);
  25.     getalOplossen(0x532F5EBD, 0x7AED59A1, 0x42850A25);
  26.     getalOplossen(0x532F5DA3, 0x7ADD5D27, 0x42B91365);
  27.     getalOplossen(0x5162C58B, 0x162D5D3A, 0x74E9D3A5);
  28.     getalOplossen(0x11A649BD, 0x46C55422, 0x48E9D3A5);
  29.     getalOplossen(0x51A649BD, 0x46C55422, 0x48E9D3C5);
  30.     getalOplossen(0x51A649BD, 0x46C40422, 0x48E9D3A5);
  31.     getalOplossen(0x51A649BD, 0x46C55422, 0x48E9D3AA);
  32.     getalOplossen(0x52E5CB89, 0x221551B1, 0x5EC932C5);
  33.     getalOplossen(0x512244A1, 0x662551A3, 0x6ED18A35);
  34.     return 0; // geen errors
  35. }
  36.  
  37. /*
  38.  * Hier worden de codes opgelost maar eerst gecontroleerd op fouten met getalTesten();
  39.  *
  40.  * @param unsigned int deel1 Het eerste gedeelte van de code
  41.  * @param unsigned int deel2 Het tweede gedeelte van de code
  42.  * @param unsigned int deel3 Het derde en laatste gedeelte van de code
  43.  *
  44.  * @return unsigned long long int Het uitgelezen getal, -1 indien fout
  45. */
  46. unsigned long long int getalOplossen(unsigned int deel1, unsigned int deel2, unsigned int deel3)
  47. {
  48.     error resultaat = getalTesten(deel1, deel2, deel3); // controleer of er fouten zijn
  49.     if (resultaat == BEGIN)
  50.     {
  51.         printf("%x %x %x heeft een slecht begin\n\n", deel1, deel2, deel3);
  52.         return -1;
  53.     }
  54.     if (resultaat == EINDE)
  55.     {
  56.         printf("%x %x %x heeft een slecht einde\n\n", deel1, deel2, deel3);
  57.         return -1;
  58.     }
  59.     if (resultaat == MIDDEN)
  60.     {
  61.         printf("%x %x %x heeft een blanco midden\n\n", deel1, deel2, deel3);
  62.         return -1;
  63.     }
  64.     if (resultaat == BITFLIP)
  65.     {
  66.         printf("%x %x %x is niet juist,\ner heeft zich een bitflip voorgedaan!\n\n", deel1, deel2, deel3);
  67.         return -1;
  68.     }
  69.     if (resultaat == OMGEDRAAID)
  70.     {
  71.         printf("%x %x %x was ondersteboven ingescand,\ngecorrigeerd wordt dit: ", deel1, deel2, deel3);
  72.         // getal omdraaien, bron: http://aggregate.org/MAGIC/#Bit%20Reversal
  73.         // draai deel1 om
  74.         deel1 = (((deel1 & 0xaaaaaaaa) >> 1) | ((deel1 & 0x55555555) << 1));
  75.         deel1 = (((deel1 & 0xcccccccc) >> 2) | ((deel1 & 0x33333333) << 2));
  76.         deel1 = (((deel1 & 0xf0f0f0f0) >> 4) | ((deel1 & 0x0f0f0f0f) << 4));
  77.         deel1 = (((deel1 & 0xff00ff00) >> 8) | ((deel1 & 0x00ff00ff) << 8));
  78.         deel1 = ((deel1 >> 16) | (deel1 << 16));
  79.         // draai deel2 om
  80.         deel2 = (((deel2 & 0xaaaaaaaa) >> 1) | ((deel2 & 0x55555555) << 1));
  81.         deel2 = (((deel2 & 0xcccccccc) >> 2) | ((deel2 & 0x33333333) << 2));
  82.         deel2 = (((deel2 & 0xf0f0f0f0) >> 4) | ((deel2 & 0x0f0f0f0f) << 4));
  83.         deel2 = (((deel2 & 0xff00ff00) >> 8) | ((deel2 & 0x00ff00ff) << 8));
  84.         deel2 = ((deel2 >> 16) | (deel2 << 16));
  85.         // draai deel3 om
  86.         deel3 = (((deel3 & 0xaaaaaaaa) >> 1) | ((deel3 & 0x55555555) << 1));
  87.         deel3 = (((deel3 & 0xcccccccc) >> 2) | ((deel3 & 0x33333333) << 2));
  88.         deel3 = (((deel3 & 0xf0f0f0f0) >> 4) | ((deel3 & 0x0f0f0f0f) << 4));
  89.         deel3 = (((deel3 & 0xff00ff00) >> 8) | ((deel3 & 0x00ff00ff) << 8));
  90.         deel3 = ((deel3 >> 16) | (deel3 << 16));
  91.         // aangezien elk deel nu is omgedraaid is de volledige code omgedraaid als we deel1 en deel3 switchen
  92.         unsigned int extraDeel;
  93.         extraDeel = deel1;
  94.         deel1 = deel3;
  95.         deel3 = extraDeel;
  96.         //correctie van de stille zone (lang zitten zoeken waarom bitflip, had het eerst in omgekeerde volgorde verschoven)
  97.         deel3 = (deel2 << 31) | (deel3 >> 1);
  98.         deel2 = (deel1 << 31) | (deel2 >> 1);
  99.         deel1 = deel1 >> 1;
  100.         // nu kunnen we deze functie opnieuw uitvoeren met gecorrigeerde code
  101.         getalOplossen(deel1, deel2, deel3);
  102.         // return'd wel degelijk een waarde want hij voert deze functie terug uit
  103.     }
  104.     if (resultaat == CLEAR)
  105.     {
  106.         printf("%x %x %x\n--> ", deel1, deel2, deel3); // geef oorspronkelijke hex-waarde
  107.         unsigned char i;
  108.         unsigned int tijdelijkGedecodeerd; // tijdelijke stockage voor ontcijferde bit's
  109.         unsigned long long int tijdelijkResultaat = 0, xTal = 100000000000; // tien-, honderd-, duizend-,... tallen
  110.         for (i = 4; i < 32; i += 7) // 1-2-3-4
  111.         {
  112.             tijdelijkGedecodeerd = getalDecoderen(((deel1 << i) & 0xFE000000) >> 25);
  113.             tijdelijkResultaat += tijdelijkGedecodeerd*xTal;
  114.             xTal /= 10;
  115.             printf("%d", tijdelijkGedecodeerd);
  116.         }
  117.         for (i = 0; i < 14; i += 7) // 5-6
  118.         {
  119.             tijdelijkGedecodeerd = getalDecoderen(((deel2 << i) & 0xFE000000) >> 25);
  120.             tijdelijkResultaat += tijdelijkGedecodeerd*xTal;
  121.             xTal /= 10;
  122.             printf("%d", tijdelijkGedecodeerd);
  123.         }
  124.         // 7
  125.         tijdelijkGedecodeerd = getalDecoderen(((deel2 << 19) & 0xFE000000) >> 25);
  126.         tijdelijkResultaat += tijdelijkGedecodeerd*xTal;
  127.         xTal /= 10;
  128.         printf(" %d", tijdelijkGedecodeerd);
  129.         // 8
  130.         tijdelijkGedecodeerd = getalDecoderen((((deel2 << 26) | (deel3 >> 6)) & 0xFE000000) >> 25);
  131.         tijdelijkResultaat += tijdelijkGedecodeerd*xTal;
  132.         xTal /= 10;
  133.         printf("%d", tijdelijkGedecodeerd);
  134.         for (i = 1; i < 29; i += 7) // 9-10-11-12
  135.         {
  136.             tijdelijkGedecodeerd = getalDecoderen(((deel3 << i) & 0xFE000000) >> 25);
  137.             tijdelijkResultaat += tijdelijkGedecodeerd*xTal;
  138.             xTal /= 10;
  139.             printf("%d", tijdelijkGedecodeerd);
  140.         }
  141.         printf("\n\n");
  142.         return tijdelijkResultaat;
  143.     }
  144. }
  145.  
  146. /*
  147.  * Hier worden de codes eerst getest op fouten
  148.  *
  149.  * @param unsigned int deel1 Het eerste gedeelte van de code
  150.  * @param unsigned int deel2 Het tweede gedeelte van de code
  151.  * @param unsigned int deel3 Het derde en laatste gedeelte van de code
  152.  *
  153.  * @return error Het type error, in het begin gedefinieerd als enum
  154. */
  155. error getalTesten(unsigned int deel1, unsigned int deel2, unsigned int deel3)
  156. {
  157.     // zijn er simpele fouten?
  158.     if ((deel1 & 0xF0000000) >> 28 != 5) // zijn de beginbit's fout?
  159.     {
  160.         return BEGIN;
  161.     }
  162.     if (((deel3 << 29) & 0xE0000000) >> 29 != 5) // zijn de eindbit's fout?
  163.     {
  164.         return EINDE;
  165.     }
  166.     if (((deel2 << 14) & 0xF8000000) >> 27 != 10) // zijn de middenbit's fout?
  167.     {
  168.         return MIDDEN;
  169.     }
  170.     // neen? test dan de rest...
  171.     unsigned char aantalFout = 0;
  172.     unsigned char i;
  173.     for (i = 4; i < 32; i += 7)
  174.     {
  175.         if(getalDecoderen(((deel1 << i) & 0xFE000000) >> 25) < 0)
  176.         {
  177.             aantalFout++;
  178.         }
  179.  
  180.     }
  181.     for (i = 0; i < 14; i += 7)
  182.     {
  183.         if(getalDecoderen(((deel2 << i) & 0xFE000000) >> 25) < 0)
  184.         {
  185.             aantalFout++;
  186.         }
  187.     }
  188.     if(getalDecoderen(((deel2 << 19) & 0xFE000000) >> 25) < 0)
  189.     {
  190.         aantalFout++;
  191.     }
  192.     if(getalDecoderen((((deel2 << 26) | (deel3 >> 6)) & 0xFE000000) >> 25) < 0)
  193.     {
  194.         aantalFout++;
  195.     }
  196.     for (i = 1; i < 29; i += 7)
  197.     {
  198.         if(getalDecoderen(((deel3 << i) & 0xFE000000) >> 25) < 0)
  199.         {
  200.             aantalFout++;
  201.         }
  202.     }
  203.     // en geef dan een andere fout terug
  204.     if (aantalFout > 0)
  205.     {
  206.         if (aantalFout == 12) // is elke waarde fout? dan is hij omgedraaid ingelezen?
  207.         {
  208.             return OMGEDRAAID;
  209.         }
  210.         else
  211.         {
  212.             return BITFLIP; // en anders een bitje verkeerd?
  213.         }
  214.     }
  215.     // of zeg dat alles veilig is
  216.     return CLEAR;
  217. }
  218.  
  219. /*
  220.  * Hier gaan we een binair getal decoderen.
  221.  * Indien de binaire waarde groter is dan 64 hebben we te maken met een geïnverteerd
  222.  *      binair getal (van de rechterkant), in dat geval terug inverteren.
  223.  *
  224.  * Als het getal niet voorkomt in de bekende lijst is het een fout getal
  225.  *      --> bitflip gebeurd of ondersteboven gescand
  226.  *
  227.  * @param binair Het gecodeerde getal in binaire vorm
  228.  *
  229.  * @return int Het gedecodeerde getal, -1 indien niet mogelijk
  230. */
  231. int getalDecoderen(unsigned int binair)
  232. {
  233.     if(binair > 64) //
  234.     {
  235.         binair = ~binair & 0x0000007F;
  236.     }
  237.     switch (binair)
  238.     {
  239.     case 13: // 0b0001101
  240.         return 0;
  241.         break;
  242.     case 25: // 0b0011001
  243.         return 1;
  244.         break;
  245.     case 19: // 0b0010011
  246.         return 2;
  247.         break;
  248.     case 61: // 0b0111101
  249.         return 3;
  250.         break;
  251.     case 35: // 0b0100011
  252.         return 4;
  253.         break;
  254.     case 49: // 0b0110001
  255.         return 5;
  256.         break;
  257.     case 47: // 0b0101111
  258.         return 6;
  259.         break;
  260.     case 59: // 0b0111011
  261.         return 7;
  262.         break;
  263.     case 55: // 0b0110111
  264.         return 8;
  265.         break;
  266.     case 11: // 0b0001011
  267.         return 9;
  268.         break;
  269.     default: // bestaat niet
  270.         return -1;
  271.     }
  272. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement