Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Programma om ingelezen barcodes te decoderen
- *
- * @author Jorim Tielemans
- */
- #include <stdio.h>
- typedef enum {BEGIN, MIDDEN, EINDE, BITFLIP, OMGEDRAAID, CLEAR} error;
- unsigned long long int getalOplossen(unsigned int deel1, unsigned int deel2, unsigned int deel3);
- error getalTesten(unsigned int deel1, unsigned int deel2, unsigned int deel3);
- int getalDecoderen(unsigned int binair);
- /*
- * De hoofdfunctie, hier kunnen eventueel andere codes opgevraagd worden aan de gebruiker
- *
- * @return int 0 indien geen errors
- */
- int main(void)
- {
- getalOplossen(0x5324DEA3, 0x62BD5124, 0x74E9D3A5);
- getalOplossen(0x5162C5B7, 0x76BD53AE, 0x42D99B95);
- getalOplossen(0x51AF578D, 0x1A355B3A, 0x66B93B65);
- getalOplossen(0x532F5EBD, 0x7AED59A1, 0x42850A25);
- getalOplossen(0x532F5DA3, 0x7ADD5D27, 0x42B91365);
- getalOplossen(0x5162C58B, 0x162D5D3A, 0x74E9D3A5);
- getalOplossen(0x11A649BD, 0x46C55422, 0x48E9D3A5);
- getalOplossen(0x51A649BD, 0x46C55422, 0x48E9D3C5);
- getalOplossen(0x51A649BD, 0x46C40422, 0x48E9D3A5);
- getalOplossen(0x51A649BD, 0x46C55422, 0x48E9D3AA);
- getalOplossen(0x52E5CB89, 0x221551B1, 0x5EC932C5);
- getalOplossen(0x512244A1, 0x662551A3, 0x6ED18A35);
- return 0; // geen errors
- }
- /*
- * Hier worden de codes opgelost maar eerst gecontroleerd op fouten met getalTesten();
- *
- * @param unsigned int deel1 Het eerste gedeelte van de code
- * @param unsigned int deel2 Het tweede gedeelte van de code
- * @param unsigned int deel3 Het derde en laatste gedeelte van de code
- *
- * @return unsigned long long int Het uitgelezen getal, -1 indien fout
- */
- unsigned long long int getalOplossen(unsigned int deel1, unsigned int deel2, unsigned int deel3)
- {
- error resultaat = getalTesten(deel1, deel2, deel3); // controleer of er fouten zijn
- if (resultaat == BEGIN)
- {
- printf("%x %x %x heeft een slecht begin\n\n", deel1, deel2, deel3);
- return -1;
- }
- if (resultaat == EINDE)
- {
- printf("%x %x %x heeft een slecht einde\n\n", deel1, deel2, deel3);
- return -1;
- }
- if (resultaat == MIDDEN)
- {
- printf("%x %x %x heeft een blanco midden\n\n", deel1, deel2, deel3);
- return -1;
- }
- if (resultaat == BITFLIP)
- {
- printf("%x %x %x is niet juist,\ner heeft zich een bitflip voorgedaan!\n\n", deel1, deel2, deel3);
- return -1;
- }
- if (resultaat == OMGEDRAAID)
- {
- printf("%x %x %x was ondersteboven ingescand,\ngecorrigeerd wordt dit: ", deel1, deel2, deel3);
- // getal omdraaien, bron: http://aggregate.org/MAGIC/#Bit%20Reversal
- // draai deel1 om
- deel1 = (((deel1 & 0xaaaaaaaa) >> 1) | ((deel1 & 0x55555555) << 1));
- deel1 = (((deel1 & 0xcccccccc) >> 2) | ((deel1 & 0x33333333) << 2));
- deel1 = (((deel1 & 0xf0f0f0f0) >> 4) | ((deel1 & 0x0f0f0f0f) << 4));
- deel1 = (((deel1 & 0xff00ff00) >> 8) | ((deel1 & 0x00ff00ff) << 8));
- deel1 = ((deel1 >> 16) | (deel1 << 16));
- // draai deel2 om
- deel2 = (((deel2 & 0xaaaaaaaa) >> 1) | ((deel2 & 0x55555555) << 1));
- deel2 = (((deel2 & 0xcccccccc) >> 2) | ((deel2 & 0x33333333) << 2));
- deel2 = (((deel2 & 0xf0f0f0f0) >> 4) | ((deel2 & 0x0f0f0f0f) << 4));
- deel2 = (((deel2 & 0xff00ff00) >> 8) | ((deel2 & 0x00ff00ff) << 8));
- deel2 = ((deel2 >> 16) | (deel2 << 16));
- // draai deel3 om
- deel3 = (((deel3 & 0xaaaaaaaa) >> 1) | ((deel3 & 0x55555555) << 1));
- deel3 = (((deel3 & 0xcccccccc) >> 2) | ((deel3 & 0x33333333) << 2));
- deel3 = (((deel3 & 0xf0f0f0f0) >> 4) | ((deel3 & 0x0f0f0f0f) << 4));
- deel3 = (((deel3 & 0xff00ff00) >> 8) | ((deel3 & 0x00ff00ff) << 8));
- deel3 = ((deel3 >> 16) | (deel3 << 16));
- // aangezien elk deel nu is omgedraaid is de volledige code omgedraaid als we deel1 en deel3 switchen
- unsigned int extraDeel;
- extraDeel = deel1;
- deel1 = deel3;
- deel3 = extraDeel;
- //correctie van de stille zone (lang zitten zoeken waarom bitflip, had het eerst in omgekeerde volgorde verschoven)
- deel3 = (deel2 << 31) | (deel3 >> 1);
- deel2 = (deel1 << 31) | (deel2 >> 1);
- deel1 = deel1 >> 1;
- // nu kunnen we deze functie opnieuw uitvoeren met gecorrigeerde code
- getalOplossen(deel1, deel2, deel3);
- // return'd wel degelijk een waarde want hij voert deze functie terug uit
- }
- if (resultaat == CLEAR)
- {
- printf("%x %x %x\n--> ", deel1, deel2, deel3); // geef oorspronkelijke hex-waarde
- unsigned char i;
- unsigned int tijdelijkGedecodeerd; // tijdelijke stockage voor ontcijferde bit's
- unsigned long long int tijdelijkResultaat = 0, xTal = 100000000000; // tien-, honderd-, duizend-,... tallen
- for (i = 4; i < 32; i += 7) // 1-2-3-4
- {
- tijdelijkGedecodeerd = getalDecoderen(((deel1 << i) & 0xFE000000) >> 25);
- tijdelijkResultaat += tijdelijkGedecodeerd*xTal;
- xTal /= 10;
- printf("%d", tijdelijkGedecodeerd);
- }
- for (i = 0; i < 14; i += 7) // 5-6
- {
- tijdelijkGedecodeerd = getalDecoderen(((deel2 << i) & 0xFE000000) >> 25);
- tijdelijkResultaat += tijdelijkGedecodeerd*xTal;
- xTal /= 10;
- printf("%d", tijdelijkGedecodeerd);
- }
- // 7
- tijdelijkGedecodeerd = getalDecoderen(((deel2 << 19) & 0xFE000000) >> 25);
- tijdelijkResultaat += tijdelijkGedecodeerd*xTal;
- xTal /= 10;
- printf(" %d", tijdelijkGedecodeerd);
- // 8
- tijdelijkGedecodeerd = getalDecoderen((((deel2 << 26) | (deel3 >> 6)) & 0xFE000000) >> 25);
- tijdelijkResultaat += tijdelijkGedecodeerd*xTal;
- xTal /= 10;
- printf("%d", tijdelijkGedecodeerd);
- for (i = 1; i < 29; i += 7) // 9-10-11-12
- {
- tijdelijkGedecodeerd = getalDecoderen(((deel3 << i) & 0xFE000000) >> 25);
- tijdelijkResultaat += tijdelijkGedecodeerd*xTal;
- xTal /= 10;
- printf("%d", tijdelijkGedecodeerd);
- }
- printf("\n\n");
- return tijdelijkResultaat;
- }
- }
- /*
- * Hier worden de codes eerst getest op fouten
- *
- * @param unsigned int deel1 Het eerste gedeelte van de code
- * @param unsigned int deel2 Het tweede gedeelte van de code
- * @param unsigned int deel3 Het derde en laatste gedeelte van de code
- *
- * @return error Het type error, in het begin gedefinieerd als enum
- */
- error getalTesten(unsigned int deel1, unsigned int deel2, unsigned int deel3)
- {
- // zijn er simpele fouten?
- if ((deel1 & 0xF0000000) >> 28 != 5) // zijn de beginbit's fout?
- {
- return BEGIN;
- }
- if (((deel3 << 29) & 0xE0000000) >> 29 != 5) // zijn de eindbit's fout?
- {
- return EINDE;
- }
- if (((deel2 << 14) & 0xF8000000) >> 27 != 10) // zijn de middenbit's fout?
- {
- return MIDDEN;
- }
- // neen? test dan de rest...
- unsigned char aantalFout = 0;
- unsigned char i;
- for (i = 4; i < 32; i += 7)
- {
- if(getalDecoderen(((deel1 << i) & 0xFE000000) >> 25) < 0)
- {
- aantalFout++;
- }
- }
- for (i = 0; i < 14; i += 7)
- {
- if(getalDecoderen(((deel2 << i) & 0xFE000000) >> 25) < 0)
- {
- aantalFout++;
- }
- }
- if(getalDecoderen(((deel2 << 19) & 0xFE000000) >> 25) < 0)
- {
- aantalFout++;
- }
- if(getalDecoderen((((deel2 << 26) | (deel3 >> 6)) & 0xFE000000) >> 25) < 0)
- {
- aantalFout++;
- }
- for (i = 1; i < 29; i += 7)
- {
- if(getalDecoderen(((deel3 << i) & 0xFE000000) >> 25) < 0)
- {
- aantalFout++;
- }
- }
- // en geef dan een andere fout terug
- if (aantalFout > 0)
- {
- if (aantalFout == 12) // is elke waarde fout? dan is hij omgedraaid ingelezen?
- {
- return OMGEDRAAID;
- }
- else
- {
- return BITFLIP; // en anders een bitje verkeerd?
- }
- }
- // of zeg dat alles veilig is
- return CLEAR;
- }
- /*
- * Hier gaan we een binair getal decoderen.
- * Indien de binaire waarde groter is dan 64 hebben we te maken met een geïnverteerd
- * binair getal (van de rechterkant), in dat geval terug inverteren.
- *
- * Als het getal niet voorkomt in de bekende lijst is het een fout getal
- * --> bitflip gebeurd of ondersteboven gescand
- *
- * @param binair Het gecodeerde getal in binaire vorm
- *
- * @return int Het gedecodeerde getal, -1 indien niet mogelijk
- */
- int getalDecoderen(unsigned int binair)
- {
- if(binair > 64) //
- {
- binair = ~binair & 0x0000007F;
- }
- switch (binair)
- {
- case 13: // 0b0001101
- return 0;
- break;
- case 25: // 0b0011001
- return 1;
- break;
- case 19: // 0b0010011
- return 2;
- break;
- case 61: // 0b0111101
- return 3;
- break;
- case 35: // 0b0100011
- return 4;
- break;
- case 49: // 0b0110001
- return 5;
- break;
- case 47: // 0b0101111
- return 6;
- break;
- case 59: // 0b0111011
- return 7;
- break;
- case 55: // 0b0110111
- return 8;
- break;
- case 11: // 0b0001011
- return 9;
- break;
- default: // bestaat niet
- return -1;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement