int GetCheckDigit(char *src); void CopyString(char *src, char *dst, int pos, int length); void UPCE2UPCA(char *src, char *dst); extern void EAN13(char *src, char *res); extern void EAN8(char *src, char *res); extern void UPCA(char *src, char *res); extern void UPCE(char *src, char *res); int GetCheckDigit(char *src) { int len = strlen(src); int CheckSum = 0; for (int i = 1; i <= len; i++) { if (i % 2 == 1) CheckSum = CheckSum + (src[len - i] - '0') * 3; else CheckSum = CheckSum + (src[len - i] - '0'); } CheckSum = CheckSum % 10; if (CheckSum != 0) CheckSum = 10 - CheckSum; return CheckSum; } void CopyString(char *src, char *dst, int pos, int length) { int DstLen = strlen(dst); for (int i = 0; i < length; i++) { dst[DstLen++] = src[pos + i]; } dst[DstLen] = '\0'; } void UPCE2UPCA(char *src, char *dst) { switch (src[6]) { case '0': case '1': case '2': CopyString(src, dst, 0, 3); CopyString(src, dst, 6, 1); strcat(dst, "0000"); CopyString(src, dst, 3, 3); break; case '3': CopyString(src, dst, 0, 4); strcat(dst, "00000"); CopyString(src, dst, 4, 2); break; case '4': CopyString(src, dst, 0, 5); strcat(dst, "00000"); CopyString(src, dst, 5, 1); break; case '5': case '6': case '7': case '8': case '9': CopyString(src, dst, 0, 6); strcat(dst, "0000"); CopyString(src, dst, 6, 1); break; } } extern void EAN13(char *src, char *res) { int len; char Message[256]; char CharSet[6]; int index; strcpy(Message, src); len = strlen(Message); // check length to make sure Data has 12 characters if (len < 12) { while(strlen(Message) < 12) { strcat(Message, "0"); } } else if (len > 12) { for(int i = 0; i < 12; i++) Message[i] = src[i]; Message[12] = '\0'; } // choose character set depending on the first character of string switch(Message[0] - '0') { case 0: strcpy(CharSet, "AAAAAA"); break; case 1: strcpy(CharSet, "AABABB"); break; case 2: strcpy(CharSet, "AABBAB"); break; case 3: strcpy(CharSet, "AABBBA"); break; case 4: strcpy(CharSet, "ABAABB"); break; case 5: strcpy(CharSet, "ABBAAB"); break; case 6: strcpy(CharSet, "ABBBAA"); break; case 7: strcpy(CharSet, "ABABAB"); break; case 8: strcpy(CharSet, "ABABBA"); break; case 9: strcpy(CharSet, "ABBABA"); break; } index = 0; res[index++] = Message[0] - '0' + 192; res[index++] = '('; for (int i = 2; i <= 7; i++) { char ch = CharSet[i - 2]; if (ch == 'A') res[index++] = Message[i - 1]; else if (ch == 'B') res[index++] = Message[i - 1] - '0' + 'Q'; } res[index++] = '*'; for (i = 8; i <= 12; i++) { res[index++] = Message[i - 1] - '0' + 'A'; } res[index++] = GetCheckDigit(Message) + 'A'; res[index++] = ')'; res[index++] = '\0'; } extern void EAN8(char *src, char *res) { int len; char Message[256]; int index; strcpy(Message, src); len = strlen(Message); // check length to make sure Data has 7 characters if (len < 7) { while(strlen(Message) < 7) { strcat(Message, "0"); } } else if (len > 7) { for(int i = 0; i < 7; i++) Message[i] = src[i]; Message[7] = '\0'; } index = 0; res[index++] = '('; for (int i = 1; i <= 4; i++) { res[index++] = Message[i - 1]; } res[index++] = '*'; for (i = 5; i <= 7; i++) { res[index++] = Message[i - 1] - '0' + 'A'; } res[index++] = GetCheckDigit(Message) + 'A'; res[index++] = ')'; res[index++] = '\0'; } extern void UPCA(char *src, char *res) { int len; char Message[256]; int index; strcpy(Message, src); len = strlen(Message); // check length to make sure Data has 11 characters if (len < 11) { while(strlen(Message) < 11) { strcat(Message, "0"); } } else if (len > 11) { for(int i = 0; i < 11; i++) Message[i] = src[i]; Message[11] = '\0'; } index = 0; res[index++] = Message[0]- '0' + 192; res[index++] = '('; res[index++] = Message[0]- '0' + 'a'; for (int i = 2; i <= 6; i++) { res[index++] = Message[i - 1]; } res[index++] = '*'; for (i = 7; i <= 11; i++) { res[index++] = Message[i - 1] - '0' + 'A'; } int CheckDigit = GetCheckDigit(Message); res[index++] = CheckDigit + 'q'; res[index++] = ')'; res[index++] = CheckDigit + 192; res[index++] = '\0'; } extern void UPCE(char *src, char *res) { int len; char Message[256]; char CharSet[6]; char tmp[100]; int index; strcpy(Message, src); len = strlen(Message); // check length to make sure Data has 6 characters if (len < 6) { while(strlen(Message) < 6) { strcat(Message, "0"); } } else if (len > 6) { for(int i = 0; i < 6; i++) Message[i] = src[i]; Message[6] = '\0'; } strcpy(tmp, "0"); strcat(tmp, Message); strcpy(Message, tmp); strcpy(tmp, ""); UPCE2UPCA(Message, tmp); int CheckDigit = GetCheckDigit(tmp); // choose character set depending on the check digit value switch(CheckDigit) { case 0: strcpy(CharSet, "BBBAAA"); break; case 1: strcpy(CharSet, "BBABAA"); break; case 2: strcpy(CharSet, "BBAABA"); break; case 3: strcpy(CharSet, "BBAAAB"); break; case 4: strcpy(CharSet, "BABBAA"); break; case 5: strcpy(CharSet, "BAABBA"); break; case 6: strcpy(CharSet, "BAAABB"); break; case 7: strcpy(CharSet, "BABABA"); break; case 8: strcpy(CharSet, "BABAAB"); break; case 9: strcpy(CharSet, "BAABAB"); break; } index = 0; res[index++] = Message[0]- '0' + 192; res[index++] = '('; for (int i = 2; i <= 7; i++) { char ch = CharSet[i - 2]; if (ch == 'A') res[index++] = Message[i - 1]; else if (ch == 'B') res[index++] = Message[i - 1] - '0' + 'Q'; } res[index++] = '+'; res[index++] = GetCheckDigit(Message) + 192; res[index++] = '\0'; }