#include #include #include static unsigned int DHL_PsiAPI_CalculateCRC(const unsigned char *data, unsigned int len) { static unsigned int crcTable[256]; static bool bFirst=true; if (bFirst) { bFirst = false; for (int i=0; i<256; i++) { unsigned int crc = 0; for (int j=7; j>=0; j--) { if (((i >> j) ^ (crc >> 31)) & 1) crc=(crc<<1)^0x04C11DB7; else crc<<=1; } crcTable[i] = crc; } } unsigned int crc = 0xFFFFFFFF; for (int i = 0; i < len; ++i) crc = (crc << 8) ^ crcTable[(crc >> 24) ^ (*data++)]; return crc; } int main(int argc, char* argv[]) { // ÀÔ·Â ÀÎÀÚ °¹¼ö È®ÀÎ if (argc != 5) { printf("%s ModelName VersionName FileName\n", argv[0]); return -1; } // ÀÔ·Â ÆÄÀÏÀÌ Á¸ÀçÇÏ´Â Áö È®ÀÎ FILE *fp = fopen(argv[3],"rb"); if (fp == 0) { printf("%s ModelName VersionName FileName\n", argv[0]); printf("Can not find file %s\n", argv[3]); return -2; } // ÀÔ·Â ÆÄÀÏÀÇ ±æÀÌ È®ÀÎ fseek(fp, 0L, SEEK_END); int nFileSize = ftell(fp); if (nFileSize == 0) { printf("%s ModelName VersionName FileName\n", argv[0]); printf("Can not find file %s\n", argv[1]); printf("File Size is Zero\n"); return -3; } // ÀÔ·Â ÆÄÀÏÀ» ÀÐ¾î µéÀÓ fseek(fp, 0L, SEEK_SET); unsigned char *data = (unsigned char*)malloc(nFileSize); if (data == 0) { printf("%s ModelName VersionName FileName\n", argv[0]); printf("Can not find file %s\n", argv[1]); printf("Out of Memory\n"); fclose(fp); return -4; } fread( data, 1, nFileSize, fp); fclose(fp); // Á¤º¸ ±¸Á¶Ã¼ struct INFO { char strModelName[10]; //Á¦Ç°¸ðµ¨¸í char strVersionName[8]; // S/W ¹öÀü char strFileSize[8]; // Àüü ÆÄÀÏ ±æÀÌ char strPosition[8]; // µ¥ÀÌÅÍÀÇ ½ÃÀÛ À§Ä¡ char strLength[8]; // µ¥ÀÌÅÍÀÇ ±æÀÌ char strMaxBlockNumber[8]; // ¸¶Áö¸· ºí·° ¹øÈ£ char strBlockNumber[8]; // ¸î¹øÂ° ºí·°ÀÎÁö 0ºÎÅÍ ½ÃÀÛ } info; memset(&info, 0, sizeof(info)); // ±¸Á¶Ã¼¿¡ ¸ðµ¨À̸§ º¹»ç int maxLen = strlen(argv[1]); if (maxLen > 9) maxLen = 9; memcpy(info.strModelName, argv[1], maxLen); // ±¸Á¶Ã¼¿¡ ¹öÀüÀ̸§ º¹»ç maxLen = strlen(argv[2]); if (maxLen > 7) maxLen = 7; memcpy(info.strVersionName, argv[2], maxLen); #if 1 // CMB¿¡ ƯȭµÈ ¹öÀü À̸§ Ç¥±â 1.0.00 // DST_Main.cppÀÇ ¹öÀü ±ÔÄ¢°ú ÀÏÄ¡½ÃÄÑ¾ß ÇÑ´Ù. sprintf(info.strVersionName, "%d.%d.%d", atoi(argv[2])/1000, (atoi(argv[2])%1000)/100, (atoi(argv[2])%1000)%100); printf("VERSION : %s\n", info.strVersionName); #endif // ±¸Á¶Ã¼¿¡ ÆÄÀÏ ±æÀÌ º¹»ç sprintf(info.strFileSize, "%d", nFileSize); //Ãâ·Â ÆÄÀÏ »ý¼º ÀÔ·ÂÆÄÀÏÀ§¿¡ .ts Ãß°¡ //char strOutFileName[4096]; //sprintf(strOutFileName, "%s.ts", argv[3]); fp = fopen(argv[4], "wb"); // ÇÑ ÆÐŶ¿¡ µé¾î°¥ ¼ø¼öÇÑ µ¥ÀÌÅÍÀÇ ÃÖ´ë ±æÀ̸¦ °è»ê int packet_length = 4031+17; int max_data_length = packet_length - 9 - sizeof(info) - 4; //total - header - private header - crc // ±¸Á¶Ã¼¿¡ °¡Àå Å« ºí·°¹øÈ£ °è»ê int nMaxBlockNumber = (nFileSize -1) / max_data_length; sprintf(info.strMaxBlockNumber, "%d", nMaxBlockNumber); for (int k = 0; k < 2; k++) // ½ºÆ®¸² Á¦³Ê·¹ÀÌÅÍ¿¡¼­ Wrap around ½Ã ºüÁú°ÍÀ» °í·ÁÇÏ¿© 2¹ÙÄû µ¹¸°´Ù. { int nBlockNumber = 0; // ÇöÀç ºí·° ¹øÈ£ for (int nPosition = 0; nPosition < nFileSize; nPosition += max_data_length) { // ±¸Á¶Ã¼¿¡ ÆÄÀÏ»ó À§Ä¡ ÀúÀå sprintf(info.strPosition, "%d", nPosition); // ±¸Á¶Ã¼¿¡ Çö ºí·°¹øÈ£ ÀúÀå sprintf(info.strBlockNumber, "%d", nBlockNumber); // ÀúÀåÇÒ µ¥ÀÌÅÍ ±æÀÌ int nLength = (nPosition + max_data_length >= nFileSize) ? nFileSize - nPosition : max_data_length; sprintf(info.strLength, "%d", nLength); //printf("nLength = %d\n", nLength); //printf("max_data_length = %d\n", max_data_length); unsigned char section[5000]; memset(section, 0xFF, 5000); int nPos = 0; // ¹è¿­³»ÀÇ ÇöÀç À§Ä¡ section[nPos++] = 0x00; section[nPos++] = 0xF5; // table id section[nPos++] = 0xF0 + ((packet_length - 4)/256); // section syntax indicator section[nPos++] = (packet_length - 4) % 256; // length section[nPos++] = 0x00; section[nPos++] = 0x01; section[nPos++] = 0xC1; section[nPos++] = nPosition & 0xFF; section[nPos++] = 0xFF; int nLen = (section[2] & 0xF)*256 + section[3]; // Á¤º¸ º¹»ç memcpy(§ion[nPos], &info, sizeof(info)); nPos += sizeof(info); // µ¥ÀÌÅÍ º¹»ç memcpy(§ion[nPos], &data[nPosition], nLength); // CRC »ðÀÔ unsigned int crc = DHL_PsiAPI_CalculateCRC(§ion[1], nLen-1); section[nLen+0] = (crc >> 24) & 0xFF; section[nLen+1] = (crc >> 16) & 0xFF; section[nLen+2] = (crc >> 8) & 0xFF; section[nLen+3] = (crc) & 0xFF; int nSectionLength = nLen; for (int i = 0; i < nSectionLength; i+= 184) // 188¿¡¼­ header 4¹ÙÀÌÆ® Á¦°Å { unsigned char packet[188]; memset(packet, 0xFF, 188); int nPos = 0; // ¹è¿­³»ÀÇ ÇöÀç À§Ä¡ packet[nPos++] = 0x47; //Sync packet[nPos++] = (i==0) ? 0x5F : 0x1F; // payload unit start indicator + 0x1FF5 packet[nPos++] = 0xF5; // pid 0x1FF5 static int continuity_counter = 0; packet[nPos++] = 0x10 + ((continuity_counter++)%16); // Adaptation field control + continuity counter // µ¥ÀÌÅÍ º¹»ç memcpy(&packet[nPos], §ion[i], 184); fwrite(packet, 1, 188, fp); // ÆÄÀÏ ÀúÀå } // printf("i = %d data_length = %d packet[3] = 0x%02X\n", i, data_length, packet[3]); unsigned char packet[188]; memset(packet, 0x00, 188); packet[0] = 0x47; //Sync packet[1] = 0x1F; packet[2] = 0xFF; packet[3] = 0x10; for ( int i = 0; i < 100; i++) // ½ºÆ®¸² Á¦³Ê·¹ÀÌÅÍ Æ¯¼º¿¡ µû¶ó Àû´çÈ÷ Á¶ÀýÇÑ´Ù. { fwrite(packet, 1, 188, fp); // ÆÄÀÏ ÀúÀå } nBlockNumber++; } } fclose(fp); return 0; }