 bfd5fc6fe1
			
		
	
	bfd5fc6fe1
	
	
	
		
			
			🔧 Grammar 279 Critical Fix: - Fixed Grammar 279 from 2-bit to 1-bit choice for ChargingComplete - Achieved 100% binary compatibility with VC2022 C++ implementation - All EXI roundtrip tests now pass with identical byte output ✨ ANSI Banner & UI Enhancements: - Added beautiful ANSI art banner for usage display - Cleaned up usage messages, removed debug options from public view - Added contact email: tindevil82@gmail.com 🛠️ Technical Improvements: - Standardized encodeNBitUnsignedInteger naming across all Grammar states - Added comprehensive debug logging for bit-level operations - Enhanced binary output handling for Windows console redirection - Improved error reporting for encoding failures 📊 Verification Results: - test5.exi: 100% binary match between C, dotnet, and VC2022 - All 43 bytes identical: 80 98 02 10 50 90 8c 0c 0c 0e 0c 50 d1 00 32 01 86 00 20 18 - Grammar state machine now perfectly aligned with OpenV2G C implementation 🚀 Ready for expansion to additional V2G message types 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			275 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			275 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!DOCTYPE html>
 | |
| <!-- saved from url=(0014)about:internet -->
 | |
|  <html xmlns:msxsl="urn:schemas-microsoft-com:xslt"><head><meta content="en-us" http-equiv="Content-Language" /><meta content="text/html; charset=utf-16" http-equiv="Content-Type" /><title _locID="ConversionReport0">
 | |
|           마이그레이션 보고서
 | |
|         </title><style> 
 | |
|                     /* Body style, for the entire document */
 | |
|                     body
 | |
|                     {
 | |
|                         background: #F3F3F4;
 | |
|                         color: #1E1E1F;
 | |
|                         font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
 | |
|                         padding: 0;
 | |
|                         margin: 0;
 | |
|                     }
 | |
| 
 | |
|                     /* Header1 style, used for the main title */
 | |
|                     h1
 | |
|                     {
 | |
|                         padding: 10px 0px 10px 10px;
 | |
|                         font-size: 21pt;
 | |
|                         background-color: #E2E2E2;
 | |
|                         border-bottom: 1px #C1C1C2 solid; 
 | |
|                         color: #201F20;
 | |
|                         margin: 0;
 | |
|                         font-weight: normal;
 | |
|                     }
 | |
| 
 | |
|                     /* Header2 style, used for "Overview" and other sections */
 | |
|                     h2
 | |
|                     {
 | |
|                         font-size: 18pt;
 | |
|                         font-weight: normal;
 | |
|                         padding: 15px 0 5px 0;
 | |
|                         margin: 0;
 | |
|                     }
 | |
| 
 | |
|                     /* Header3 style, used for sub-sections, such as project name */
 | |
|                     h3
 | |
|                     {
 | |
|                         font-weight: normal;
 | |
|                         font-size: 15pt;
 | |
|                         margin: 0;
 | |
|                         padding: 15px 0 5px 0;
 | |
|                         background-color: transparent;
 | |
|                     }
 | |
| 
 | |
|                     /* Color all hyperlinks one color */
 | |
|                     a
 | |
|                     {
 | |
|                         color: #1382CE;
 | |
|                     }
 | |
| 
 | |
|                     /* Table styles */ 
 | |
|                     table
 | |
|                     {
 | |
|                         border-spacing: 0 0;
 | |
|                         border-collapse: collapse;
 | |
|                         font-size: 10pt;
 | |
|                     }
 | |
| 
 | |
|                     table th
 | |
|                     {
 | |
|                         background: #E7E7E8;
 | |
|                         text-align: left;
 | |
|                         text-decoration: none;
 | |
|                         font-weight: normal;
 | |
|                         padding: 3px 6px 3px 6px;
 | |
|                     }
 | |
| 
 | |
|                     table td
 | |
|                     {
 | |
|                         vertical-align: top;
 | |
|                         padding: 3px 6px 5px 5px;
 | |
|                         margin: 0px;
 | |
|                         border: 1px solid #E7E7E8;
 | |
|                         background: #F7F7F8;
 | |
|                     }
 | |
| 
 | |
|                     /* Local link is a style for hyperlinks that link to file:/// content, there are lots so color them as 'normal' text until the user mouse overs */
 | |
|                     .localLink
 | |
|                     {
 | |
|                         color: #1E1E1F;
 | |
|                         background: #EEEEED;
 | |
|                         text-decoration: none;
 | |
|                     }
 | |
| 
 | |
|                     .localLink:hover
 | |
|                     {
 | |
|                         color: #1382CE;
 | |
|                         background: #FFFF99;
 | |
|                         text-decoration: none;
 | |
|                     }
 | |
| 
 | |
|                     /* Center text, used in the over views cells that contain message level counts */ 
 | |
|                     .textCentered
 | |
|                     {
 | |
|                         text-align: center;
 | |
|                     }
 | |
| 
 | |
|                     /* The message cells in message tables should take up all avaliable space */
 | |
|                     .messageCell
 | |
|                     {
 | |
|                         width: 100%;
 | |
|                     }
 | |
| 
 | |
|                     /* Padding around the content after the h1 */ 
 | |
|                     #content 
 | |
|                     {
 | |
| 	                    padding: 0px 12px 12px 12px; 
 | |
|                     }
 | |
| 
 | |
|                     /* The overview table expands to width, with a max width of 97% */ 
 | |
|                     #overview table
 | |
|                     {
 | |
|                         width: auto;
 | |
|                         max-width: 75%; 
 | |
|                     }
 | |
| 
 | |
|                     /* The messages tables are always 97% width */
 | |
|                     #messages table
 | |
|                     {
 | |
|                         width: 97%;
 | |
|                     }
 | |
| 
 | |
|                     /* All Icons */
 | |
|                     .IconSuccessEncoded, .IconInfoEncoded, .IconWarningEncoded, .IconErrorEncoded
 | |
|                     {
 | |
|                         min-width:18px;
 | |
|                         min-height:18px; 
 | |
|                         background-repeat:no-repeat;
 | |
|                         background-position:center;
 | |
|                     }
 | |
| 
 | |
|                     /* Success icon encoded */
 | |
|                     .IconSuccessEncoded
 | |
|                     {
 | |
|                         /* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
 | |
|                         /* [---XsltValidateInternal-Base64EncodedImage:IconSuccess#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
 | |
|                         background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABcElEQVR4Xq2TsUsCURzHv15g8ZJcBWlyiYYgCIWcb9DFRRwMW5TA2c0/QEFwFkxxUQdxVlBwCYWOi6IhWgQhBLHJUCkhLr/BW8S7gvrAg+N+v8/v+x68Z8MGy+XSCyABQAXgBgHGALoASkIIDWSLeLBetdHryMjd5IxQPWT4rn1c/P7+xxp72Cs9m5SZ0Bq2vPnbPFafK2zDvmNHypdC0BPkLlQhxJsCAhQoZwdZU5mwxh720qGo8MzTxTTKZDPCx2HoVzp6lz0Q9tKhyx0kGs8Ny+TkWRKk8lCROwEduhyg9l/6lunOPSfmH3NUH6uQ0KHLAe7JYvJjevm+DAMGJHToKtigE+vwvIidxLamb8IBY9e+C5LiXREkfho3TSd06HJA13/oh6T51MTsfQbHrsMynQ5dDihFjiK8JJAU9AKIWTp76dCVN7HWHrajmUEGvyF9nkbAE6gLIS7kTUyuf2gscLoJrElZo/Mvj+nPz/kLTmfnEwP3tB0AAAAASUVORK5CYII=);
 | |
|                     }
 | |
| 
 | |
|                     /* Information icon encoded */
 | |
|                     .IconInfoEncoded
 | |
|                     {
 | |
|                         /* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
 | |
|                         /* [---XsltValidateInternal-Base64EncodedImage:IconInformation#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
 | |
|                         background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHElEQVR4Xs2TsUoDQRRF7wwoziokjZUKadInhdhukR9YP8DMX1hYW+QvdsXa/QHBbcXC7W0CamWTQnclFutceIQJwwaWNLlwm5k5d94M76mmaeCrrmsLYOocY12FcxZFUeozCqKqqgYA8uevv1H6VuPxcwlfk5N92KHBxfFeCSAxxswlYAW/Xr989x/mv9gkhtyMDhcAxgzRsp7flj8B/HF1RsMXq+NZMkopaHe7lbKxQUEIGbKsYNoGn969060hZBkQex/W8oRQwsQaW2o3Ago2SVcJUzAgY3N0lTCZZm+zPS8HB51gMmS1DEYyOz9acKO1D8JWTlafKIMxdhvlfdyT94Vv5h7P8Ky7nQzACmhvKq3zk3PjW9asz9D/1oigecsioooAAAAASUVORK5CYII=);
 | |
|                     }
 | |
| 
 | |
|                     /* Warning icon encoded */
 | |
|                     .IconWarningEncoded
 | |
|                     {
 | |
|                         /* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
 | |
|                         /* [---XsltValidateInternal-Base64EncodedImage:IconWarning#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
 | |
|                         background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAx0lEQVR4XpWSMQ7CMAxFf4xAyBMLCxMrO8dhaBcuwdCJS3RJBw7SA/QGTCxdWJgiQYWKXJWKIXHIlyw5lqr34tQgEOdcBsCOx5yZK3hCCKdYXneQkh4pEfqzLfu+wVDSyyzFoJjfz9NB+pAF+eizx2Vruts0k15mPgvS6GYvpVtQhB61IB/dk6AF6fS4Ben0uIX5odtFe8Q/eW1KvFeH4e8khT6+gm5B+t3juyDt7n0jpe+CANTd+oTUjN/U3yVaABnSUjFz/gFq44JaVSCXeQAAAABJRU5ErkJggg==);
 | |
|                     }
 | |
| 
 | |
|                     /* Error icon encoded */
 | |
|                     .IconErrorEncoded
 | |
|                     {
 | |
|                         /* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
 | |
|                         /* [---XsltValidateInternal-Base64EncodedImage:IconError#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
 | |
|                         background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABQElEQVR4XqWTvUoEQRCE6wYPZUA80AfwAQz23uCMjA7MDRQEIzPBVEyNTQUFIw00vcQTTMzuAh/AxEQQT8HF/3G/oGGnEUGuoNnd6qoZuqltyKEsyzVJq5I6rnUp6SjGeGhESikzzlc1eL7opfuVbrqbU1Zw9NCgtQMaZpY0eNnaaL2fHusvTK5vKu7sjSS1Y4y3QUA6K3e3Mau5UFDyMP7tYF9o8cAHZv68vipoIJg971PZIZ5HiwdvYGGvFVFHmGmZ2MxwmQYPXubPl9Up0tfoMQGetXd6mRbvhBw+boZ6WF7Mbv1+GsHRk0fQmPAH1GfmZirbCfDJ61tw3Px8/8pZsPAG4jlVhcPgZ7adwNWBB68lkRQWFiTgFlbnLY3DGGM7izIJIyT/jjIvEJw6fdJTc6krDzh6aMwMP9bvDH4ADSsa9uSWVJkAAAAASUVORK5CYII=);
 | |
|                     }
 | |
|                  </style><script type="text/javascript" language="javascript"> 
 | |
|           
 | |
|             // Startup 
 | |
|             // Hook up the the loaded event for the document/window, to linkify the document content
 | |
|             var startupFunction = function() { linkifyElement("messages"); };
 | |
|             
 | |
|             if(window.attachEvent)
 | |
|             {
 | |
|               window.attachEvent('onload', startupFunction);
 | |
|             }
 | |
|             else if (window.addEventListener) 
 | |
|             {
 | |
|               window.addEventListener('load', startupFunction, false);
 | |
|             }
 | |
|             else 
 | |
|             {
 | |
|               document.addEventListener('load', startupFunction, false);
 | |
|             } 
 | |
|             
 | |
|             // Toggles the visibility of table rows with the specified name 
 | |
|             function toggleTableRowsByName(name)
 | |
|             {
 | |
|                var allRows = document.getElementsByTagName('tr');
 | |
|                for (i=0; i < allRows.length; i++)
 | |
|                {
 | |
|                   var currentName = allRows[i].getAttribute('name');
 | |
|                   if(!!currentName && currentName.indexOf(name) == 0)
 | |
|                   {
 | |
|                       var isVisible = allRows[i].style.display == ''; 
 | |
|                       isVisible ? allRows[i].style.display = 'none' : allRows[i].style.display = '';
 | |
|                   }
 | |
|                }
 | |
|             }
 | |
|             
 | |
|             function scrollToFirstVisibleRow(name) 
 | |
|             {
 | |
|                var allRows = document.getElementsByTagName('tr');
 | |
|                for (i=0; i < allRows.length; i++)
 | |
|                {
 | |
|                   var currentName = allRows[i].getAttribute('name');
 | |
|                   var isVisible = allRows[i].style.display == ''; 
 | |
|                   if(!!currentName && currentName.indexOf(name) == 0 && isVisible)
 | |
|                   {
 | |
|                      allRows[i].scrollIntoView(true); 
 | |
|                      return true; 
 | |
|                   }
 | |
|                }
 | |
|                
 | |
|                return false;
 | |
|             }
 | |
|             
 | |
|             // Linkifies the specified text content, replaces candidate links with html links 
 | |
|             function linkify(text)
 | |
|             {
 | |
|                  if(!text || 0 === text.length)
 | |
|                  {
 | |
|                      return text; 
 | |
|                  }
 | |
| 
 | |
|                  // Find http, https and ftp links and replace them with hyper links 
 | |
|                  var urlLink = /(http|https|ftp)\:\/\/[a-zA-Z0-9\-\.]+(:[a-zA-Z0-9]*)?\/?([a-zA-Z0-9\-\._\?\,\/\\\+&%\$#\=~;\{\}])*/gi;
 | |
|                  
 | |
|                  return text.replace(urlLink, '<a href="$&">$&</a>') ;
 | |
|             }
 | |
|             
 | |
|             // Linkifies the specified element by ID
 | |
|             function linkifyElement(id)
 | |
|             {
 | |
|                 var element = document.getElementById(id);
 | |
|                 if(!!element)
 | |
|                 {
 | |
|                   element.innerHTML = linkify(element.innerHTML); 
 | |
|                 }
 | |
|             }
 | |
|             
 | |
|             function ToggleMessageVisibility(projectName)
 | |
|             {
 | |
|               if(!projectName || 0 === projectName.length)
 | |
|               {
 | |
|                 return; 
 | |
|               }
 | |
|               
 | |
|               toggleTableRowsByName("MessageRowClass" + projectName);
 | |
|               toggleTableRowsByName('MessageRowHeaderShow' + projectName);
 | |
|               toggleTableRowsByName('MessageRowHeaderHide' + projectName); 
 | |
|             }
 | |
|             
 | |
|             function ScrollToFirstVisibleMessage(projectName)
 | |
|             {
 | |
|               if(!projectName || 0 === projectName.length)
 | |
|               {
 | |
|                 return; 
 | |
|               }
 | |
|               
 | |
|               // First try the 'Show messages' row
 | |
|               if(!scrollToFirstVisibleRow('MessageRowHeaderShow' + projectName))
 | |
|               {
 | |
|                 // Failed to find a visible row for 'Show messages', try an actual message row 
 | |
|                 scrollToFirstVisibleRow('MessageRowClass' + projectName); 
 | |
|               }
 | |
|             }
 | |
|            </script></head><body><h1 _locID="ConversionReport">
 | |
|           마이그레이션 보고서 - </h1><div id="content"><h2 _locID="OverviewTitle">개요</h2><div id="overview"><table><tr><th></th><th _locID="ProjectTableHeader">프로젝트</th><th _locID="PathTableHeader">경로</th><th _locID="ErrorsTableHeader">오류</th><th _locID="WarningsTableHeader">경고</th><th _locID="MessagesTableHeader">메시지</th></tr><tr><td class="IconErrorEncoded" /><td><strong><a href="#HexDumpToBinary">HexDumpToBinary</a></strong></td><td>HexDumpToBinary\HexDumpToBinary.vcxproj</td><td class="textCentered"><a href="#HexDumpToBinaryError">1</a></td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#">0</a></td></tr><tr><td class="IconErrorEncoded" /><td><strong><a href="#HexToBinary">HexToBinary</a></strong></td><td>HexToBinary\HexToBinary.vcxproj</td><td class="textCentered"><a href="#HexToBinaryError">1</a></td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#">0</a></td></tr><tr><td class="IconErrorEncoded" /><td><strong><a href="#V2GDecoder">V2GDecoder</a></strong></td><td>V2GDecoder\V2GDecoder.vcxproj</td><td class="textCentered"><a href="#V2GDecoderError">1</a></td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#">0</a></td></tr><tr><td class="IconSuccessEncoded" /><td><strong><a href="#Solution"><span _locID="OverviewSolutionSpan">솔루션</span></a></strong></td><td>V2GDecoderC.sln</td><td class="textCentered"><a>0</a></td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#" onclick="ScrollToFirstVisibleMessage('Solution'); return false;">1</a></td></tr></table></div><h2 _locID="SolutionAndProjectsTitle">솔루션 및 프로젝트</h2><div id="messages"><a name="HexDumpToBinary" /><h3>HexDumpToBinary</h3><table><tr id="HexDumpToBinaryHeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">메시지</th></tr><tr name="ErrorRowClassHexDumpToBinary"><td class="IconErrorEncoded"><a name="HexDumpToBinaryError" /></td><td class="messageCell"><strong>HexDumpToBinary\HexDumpToBinary.vcxproj:
 | |
|         </strong><span>이 프로젝트 형식을 기반으로 하는 애플리케이션을 찾지 못했습니다. 추가 정보를 보려면 이 링크를 확인하십시오. 8bc9ceb8-8b4a-11d0-8d11-00a0c91bc942</span></td></tr></table><a name="HexToBinary" /><h3>HexToBinary</h3><table><tr id="HexToBinaryHeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">메시지</th></tr><tr name="ErrorRowClassHexToBinary"><td class="IconErrorEncoded"><a name="HexToBinaryError" /></td><td class="messageCell"><strong>HexToBinary\HexToBinary.vcxproj:
 | |
|         </strong><span>이 프로젝트 형식을 기반으로 하는 애플리케이션을 찾지 못했습니다. 추가 정보를 보려면 이 링크를 확인하십시오. 8bc9ceb8-8b4a-11d0-8d11-00a0c91bc942</span></td></tr></table><a name="V2GDecoder" /><h3>V2GDecoder</h3><table><tr id="V2GDecoderHeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">메시지</th></tr><tr name="ErrorRowClassV2GDecoder"><td class="IconErrorEncoded"><a name="V2GDecoderError" /></td><td class="messageCell"><strong>V2GDecoder\V2GDecoder.vcxproj:
 | |
|         </strong><span>이 프로젝트 형식을 기반으로 하는 애플리케이션을 찾지 못했습니다. 추가 정보를 보려면 이 링크를 확인하십시오. 8bc9ceb8-8b4a-11d0-8d11-00a0c91bc942</span></td></tr></table><a name="Solution" /><h3 _locID="ProjectDisplayNameHeader">솔루션</h3><table><tr id="SolutionHeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">메시지</th></tr><tr name="MessageRowHeaderShowSolution"><td class="IconInfoEncoded" /><td class="messageCell"><a _locID="ShowAdditionalMessages" href="#" name="SolutionMessage" onclick="ToggleMessageVisibility('Solution'); return false;">
 | |
|           표시 1 추가 메시지
 | |
|         </a></td></tr><tr name="MessageRowClassSolution" style="display: none"><td class="IconInfoEncoded"><a name="SolutionMessage" /></td><td class="messageCell"><strong>V2GDecoderC.sln:
 | |
|         </strong><span>솔루션 파일은 마이그레이션하지 않아도 됩니다.</span></td></tr><tr style="display: none" name="MessageRowHeaderHideSolution"><td class="IconInfoEncoded" /><td class="messageCell"><a _locID="HideAdditionalMessages" href="#" name="SolutionMessage" onclick="ToggleMessageVisibility('Solution'); return false;">
 | |
|           숨기기 1 추가 메시지
 | |
|         </a></td></tr></table></div></div></body></html> |