| 1 | #include <stdio.h> |
|---|
| 2 | #include <stdlib.h> |
|---|
| 3 | #include <memory.h> |
|---|
| 4 | |
|---|
| 5 | static unsigned int DHL_PsiAPI_CalculateCRC(const unsigned char *data, unsigned int len) |
|---|
| 6 | { |
|---|
| 7 | static unsigned int crcTable[256]; |
|---|
| 8 | static bool bFirst=true; |
|---|
| 9 | if (bFirst) |
|---|
| 10 | { |
|---|
| 11 | bFirst = false; |
|---|
| 12 | for (int i=0; i<256; i++) { |
|---|
| 13 | unsigned int crc = 0; |
|---|
| 14 | for (int j=7; j>=0; j--) { |
|---|
| 15 | if (((i >> j) ^ (crc >> 31)) & 1) crc=(crc<<1)^0x04C11DB7; |
|---|
| 16 | else crc<<=1; |
|---|
| 17 | } |
|---|
| 18 | crcTable[i] = crc; |
|---|
| 19 | } |
|---|
| 20 | } |
|---|
| 21 | unsigned int crc = 0xFFFFFFFF; |
|---|
| 22 | for (int i = 0; i < len; ++i) crc = (crc << 8) ^ crcTable[(crc >> 24) ^ (*data++)]; |
|---|
| 23 | return crc; |
|---|
| 24 | } |
|---|
| 25 | |
|---|
| 26 | int main(int argc, char* argv[]) |
|---|
| 27 | { |
|---|
| 28 | // ÀÔ·Â ÀÎÀÚ °¹¼ö È®ÀÎ |
|---|
| 29 | if (argc != 5) |
|---|
| 30 | { |
|---|
| 31 | printf("%s ModelName VersionName FileName\n", argv[0]); |
|---|
| 32 | return -1; |
|---|
| 33 | } |
|---|
| 34 | |
|---|
| 35 | // ÀÔ·Â ÆÄÀÏÀÌ Á¸ÀçÇÏ´Â Áö È®ÀÎ |
|---|
| 36 | FILE *fp = fopen(argv[3],"rb"); |
|---|
| 37 | if (fp == 0) |
|---|
| 38 | { |
|---|
| 39 | printf("%s ModelName VersionName FileName\n", argv[0]); |
|---|
| 40 | printf("Can not find file %s\n", argv[3]); |
|---|
| 41 | return -2; |
|---|
| 42 | } |
|---|
| 43 | |
|---|
| 44 | // ÀÔ·Â ÆÄÀÏÀÇ ±æÀÌ È®ÀÎ |
|---|
| 45 | fseek(fp, 0L, SEEK_END); |
|---|
| 46 | int nFileSize = ftell(fp); |
|---|
| 47 | if (nFileSize == 0) |
|---|
| 48 | { |
|---|
| 49 | printf("%s ModelName VersionName FileName\n", argv[0]); |
|---|
| 50 | printf("Can not find file %s\n", argv[1]); |
|---|
| 51 | printf("File Size is Zero\n"); |
|---|
| 52 | return -3; |
|---|
| 53 | } |
|---|
| 54 | |
|---|
| 55 | // ÀÔ·Â ÆÄÀÏÀ» ÀÐ¾î µéÀÓ |
|---|
| 56 | fseek(fp, 0L, SEEK_SET); |
|---|
| 57 | unsigned char *data = (unsigned char*)malloc(nFileSize); |
|---|
| 58 | if (data == 0) |
|---|
| 59 | { |
|---|
| 60 | printf("%s ModelName VersionName FileName\n", argv[0]); |
|---|
| 61 | printf("Can not find file %s\n", argv[1]); |
|---|
| 62 | printf("Out of Memory\n"); |
|---|
| 63 | fclose(fp); |
|---|
| 64 | return -4; |
|---|
| 65 | } |
|---|
| 66 | fread( data, 1, nFileSize, fp); |
|---|
| 67 | fclose(fp); |
|---|
| 68 | |
|---|
| 69 | // Á¤º¸ ±¸Á¶Ã¼ |
|---|
| 70 | struct INFO |
|---|
| 71 | { |
|---|
| 72 | char strModelName[10]; //Á¦Ç°¸ðµ¨¸í |
|---|
| 73 | char strVersionName[8]; // S/W ¹öÀü |
|---|
| 74 | char strFileSize[8]; // Àüü ÆÄÀÏ ±æÀÌ |
|---|
| 75 | char strPosition[8]; // µ¥ÀÌÅÍÀÇ ½ÃÀÛ À§Ä¡ |
|---|
| 76 | char strLength[8]; // µ¥ÀÌÅÍÀÇ ±æÀÌ |
|---|
| 77 | char strMaxBlockNumber[8]; // ¸¶Áö¸· ºí·° ¹øÈ£ |
|---|
| 78 | char strBlockNumber[8]; // ¸î¹øÂ° ºí·°ÀÎÁö 0ºÎÅÍ ½ÃÀÛ |
|---|
| 79 | } info; |
|---|
| 80 | |
|---|
| 81 | memset(&info, 0, sizeof(info)); |
|---|
| 82 | |
|---|
| 83 | // ±¸Á¶Ã¼¿¡ ¸ðµ¨À̸§ º¹»ç |
|---|
| 84 | int maxLen = strlen(argv[1]); |
|---|
| 85 | if (maxLen > 9) maxLen = 9; |
|---|
| 86 | memcpy(info.strModelName, argv[1], maxLen); |
|---|
| 87 | |
|---|
| 88 | // ±¸Á¶Ã¼¿¡ ¹öÀüÀ̸§ º¹»ç |
|---|
| 89 | maxLen = strlen(argv[2]); |
|---|
| 90 | if (maxLen > 7) maxLen = 7; |
|---|
| 91 | memcpy(info.strVersionName, argv[2], maxLen); |
|---|
| 92 | #if 1 |
|---|
| 93 | // CMB¿¡ Æ¯ÈµÈ ¹öÀü À̸§ Ç¥±â 1.0.00 |
|---|
| 94 | // DST_Main.cppÀÇ ¹öÀü ±ÔÄ¢°ú ÀÏÄ¡½ÃÄÑ¾ß ÇÑ´Ù. |
|---|
| 95 | sprintf(info.strVersionName, "%d.%d.%d", |
|---|
| 96 | atoi(argv[2])/1000, |
|---|
| 97 | (atoi(argv[2])%1000)/100, |
|---|
| 98 | (atoi(argv[2])%1000)%100); |
|---|
| 99 | printf("VERSION : %s\n", info.strVersionName); |
|---|
| 100 | #endif |
|---|
| 101 | // ±¸Á¶Ã¼¿¡ ÆÄÀÏ ±æÀÌ º¹»ç |
|---|
| 102 | sprintf(info.strFileSize, "%d", nFileSize); |
|---|
| 103 | |
|---|
| 104 | //Ãâ·Â ÆÄÀÏ »ý¼º ÀÔ·ÂÆÄÀÏÀ§¿¡ .ts Ãß°¡ |
|---|
| 105 | //char strOutFileName[4096]; |
|---|
| 106 | //sprintf(strOutFileName, "%s.ts", argv[3]); |
|---|
| 107 | fp = fopen(argv[4], "wb"); |
|---|
| 108 | |
|---|
| 109 | // ÇÑ ÆÐŶ¿¡ µé¾î°¥ ¼ø¼öÇÑ µ¥ÀÌÅÍÀÇ ÃÖ´ë ±æÀ̸¦ °è»ê |
|---|
| 110 | int packet_length = 4031+17; |
|---|
| 111 | int max_data_length = packet_length - 9 - sizeof(info) - 4; //total - header - private header - crc |
|---|
| 112 | |
|---|
| 113 | // ±¸Á¶Ã¼¿¡ °¡Àå Å« ºí·°¹øÈ£ °è»ê |
|---|
| 114 | int nMaxBlockNumber = (nFileSize -1) / max_data_length; |
|---|
| 115 | sprintf(info.strMaxBlockNumber, "%d", nMaxBlockNumber); |
|---|
| 116 | |
|---|
| 117 | for (int k = 0; k < 2; k++) // ½ºÆ®¸² Á¦³Ê·¹ÀÌÅÍ¿¡¼ Wrap around ½Ã ºüÁú°ÍÀ» °í·ÁÇÏ¿© 2¹ÙÄû µ¹¸°´Ù. |
|---|
| 118 | { |
|---|
| 119 | int nBlockNumber = 0; // ÇöÀç ºí·° ¹øÈ£ |
|---|
| 120 | for (int nPosition = 0; nPosition < nFileSize; nPosition += max_data_length) |
|---|
| 121 | { |
|---|
| 122 | // ±¸Á¶Ã¼¿¡ ÆÄÀÏ»ó À§Ä¡ ÀúÀå |
|---|
| 123 | sprintf(info.strPosition, "%d", nPosition); |
|---|
| 124 | |
|---|
| 125 | // ±¸Á¶Ã¼¿¡ Çö ºí·°¹øÈ£ ÀúÀå |
|---|
| 126 | sprintf(info.strBlockNumber, "%d", nBlockNumber); |
|---|
| 127 | |
|---|
| 128 | // ÀúÀåÇÒ µ¥ÀÌÅÍ ±æÀÌ |
|---|
| 129 | int nLength = (nPosition + max_data_length >= nFileSize) ? nFileSize - nPosition : max_data_length; |
|---|
| 130 | sprintf(info.strLength, "%d", nLength); |
|---|
| 131 | |
|---|
| 132 | //printf("nLength = %d\n", nLength); |
|---|
| 133 | //printf("max_data_length = %d\n", max_data_length); |
|---|
| 134 | |
|---|
| 135 | unsigned char section[5000]; |
|---|
| 136 | memset(section, 0xFF, 5000); |
|---|
| 137 | int nPos = 0; // ¹è¿³»ÀÇ ÇöÀç À§Ä¡ |
|---|
| 138 | section[nPos++] = 0x00; |
|---|
| 139 | section[nPos++] = 0xF5; // table id |
|---|
| 140 | section[nPos++] = 0xF0 + ((packet_length - 4)/256); // section syntax indicator |
|---|
| 141 | section[nPos++] = (packet_length - 4) % 256; // length |
|---|
| 142 | section[nPos++] = 0x00; |
|---|
| 143 | section[nPos++] = 0x01; |
|---|
| 144 | section[nPos++] = 0xC1; |
|---|
| 145 | section[nPos++] = nPosition & 0xFF; |
|---|
| 146 | section[nPos++] = 0xFF; |
|---|
| 147 | |
|---|
| 148 | int nLen = (section[2] & 0xF)*256 + section[3]; |
|---|
| 149 | // Á¤º¸ º¹»ç |
|---|
| 150 | memcpy(§ion[nPos], &info, sizeof(info)); |
|---|
| 151 | nPos += sizeof(info); |
|---|
| 152 | |
|---|
| 153 | // µ¥ÀÌÅÍ º¹»ç |
|---|
| 154 | memcpy(§ion[nPos], &data[nPosition], nLength); |
|---|
| 155 | |
|---|
| 156 | // CRC »ðÀÔ |
|---|
| 157 | unsigned int crc = DHL_PsiAPI_CalculateCRC(§ion[1], nLen-1); |
|---|
| 158 | |
|---|
| 159 | section[nLen+0] = (crc >> 24) & 0xFF; |
|---|
| 160 | section[nLen+1] = (crc >> 16) & 0xFF; |
|---|
| 161 | section[nLen+2] = (crc >> 8) & 0xFF; |
|---|
| 162 | section[nLen+3] = (crc) & 0xFF; |
|---|
| 163 | |
|---|
| 164 | int nSectionLength = nLen; |
|---|
| 165 | for (int i = 0; i < nSectionLength; i+= 184) // 188¿¡¼ header 4¹ÙÀÌÆ® Á¦°Å |
|---|
| 166 | { |
|---|
| 167 | unsigned char packet[188]; |
|---|
| 168 | memset(packet, 0xFF, 188); |
|---|
| 169 | int nPos = 0; // ¹è¿³»ÀÇ ÇöÀç À§Ä¡ |
|---|
| 170 | packet[nPos++] = 0x47; //Sync |
|---|
| 171 | packet[nPos++] = (i==0) ? 0x5F : 0x1F; // payload unit start indicator + 0x1FF5 |
|---|
| 172 | packet[nPos++] = 0xF5; // pid 0x1FF5 |
|---|
| 173 | static int continuity_counter = 0; |
|---|
| 174 | packet[nPos++] = 0x10 + ((continuity_counter++)%16); // Adaptation field control + continuity counter |
|---|
| 175 | // µ¥ÀÌÅÍ º¹»ç |
|---|
| 176 | memcpy(&packet[nPos], §ion[i], 184); |
|---|
| 177 | fwrite(packet, 1, 188, fp); // ÆÄÀÏ ÀúÀå |
|---|
| 178 | } |
|---|
| 179 | // printf("i = %d data_length = %d packet[3] = 0x%02X\n", i, data_length, packet[3]); |
|---|
| 180 | unsigned char packet[188]; |
|---|
| 181 | memset(packet, 0x00, 188); |
|---|
| 182 | packet[0] = 0x47; //Sync |
|---|
| 183 | packet[1] = 0x1F; |
|---|
| 184 | packet[2] = 0xFF; |
|---|
| 185 | packet[3] = 0x10; |
|---|
| 186 | for ( int i = 0; i < 100; i++) // ½ºÆ®¸² Á¦³Ê·¹ÀÌÅÍ Æ¯¼º¿¡ µû¶ó Àû´çÈ÷ Á¶ÀýÇÑ´Ù. |
|---|
| 187 | { |
|---|
| 188 | fwrite(packet, 1, 188, fp); // ÆÄÀÏ ÀúÀå |
|---|
| 189 | } |
|---|
| 190 | |
|---|
| 191 | nBlockNumber++; |
|---|
| 192 | } |
|---|
| 193 | } |
|---|
| 194 | fclose(fp); |
|---|
| 195 | return 0; |
|---|
| 196 | } |
|---|