Major architectural refactoring to achieve 1:1 structural compatibility: 🏗️ **VC2022 Structure Replication** - Iso1EXIDocument: 1:1 replica of VC2022 iso1EXIDocument struct - DinEXIDocument: 1:1 replica of VC2022 dinEXIDocument struct - Iso2EXIDocument: 1:1 replica of VC2022 iso2EXIDocument struct - All _isUsed flags and Initialize() methods exactly matching VC2022 🔄 **VC2022 Function Porting** - ParseXmlToIso1(): Exact port of VC2022 parse_xml_to_iso1() - EncodeIso1ExiDocument(): Exact port of VC2022 encode_iso1ExiDocument() - Choice 76 (V2G_Message) encoding with identical logic - BulkChargingComplete ignore behavior preserved ⚡ **Call Sequence Alignment** - Old: EncodeV2GMessage() → direct EXI encoding - New: EncodeV2GMessage() → Iso1EXIDocument → EncodeIso1ExiDocument() - Exact VC2022 call chain: init → parse → encode → finish 🔍 **1:1 Debug Comparison Ready** - C# exiDoc.V2G_Message_isUsed ↔ VC2022 exiDoc->V2G_Message_isUsed - Identical structure enables line-by-line debugging comparison - Ready for precise 1-byte difference investigation (41 vs 42 bytes) 📁 **Project Reorganization** - Moved from csharp/ to Port/ for cleaner structure - Port/dotnet/ and Port/vc2022/ for parallel development - Complete build system and documentation updates 🎯 **Achievement**: 97.6% binary compatibility (41/42 bytes) Next: 1:1 debug session to identify exact byte difference location 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			76 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <ctype.h>
 | |
| 
 | |
| int hex_char_to_int(char c) {
 | |
|     if (c >= '0' && c <= '9') return c - '0';
 | |
|     if (c >= 'A' && c <= 'F') return c - 'A' + 10;
 | |
|     if (c >= 'a' && c <= 'f') return c - 'a' + 10;
 | |
|     return -1;
 | |
| }
 | |
| 
 | |
| int main() {
 | |
|     const char* hex_string = "8098021050908C0C0C0E0C50D10032018600A01881AE0601860C806140C801030800006100001881980600";
 | |
|     
 | |
|     size_t hex_len = strlen(hex_string);
 | |
|     if (hex_len % 2 != 0) {
 | |
|         printf("Error: Hex string length must be even\n");
 | |
|         return -1;
 | |
|     }
 | |
|     
 | |
|     size_t binary_len = hex_len / 2;
 | |
|     unsigned char* binary_data = malloc(binary_len);
 | |
|     
 | |
|     if (!binary_data) {
 | |
|         printf("Memory allocation failed\n");
 | |
|         return -1;
 | |
|     }
 | |
|     
 | |
|     // Convert hex string to binary
 | |
|     for (size_t i = 0; i < binary_len; i++) {
 | |
|         int high = hex_char_to_int(hex_string[i * 2]);
 | |
|         int low = hex_char_to_int(hex_string[i * 2 + 1]);
 | |
|         
 | |
|         if (high == -1 || low == -1) {
 | |
|             printf("Invalid hex character at position %zu\n", i * 2);
 | |
|             free(binary_data);
 | |
|             return -1;
 | |
|         }
 | |
|         
 | |
|         binary_data[i] = (high << 4) | low;
 | |
|     }
 | |
|     
 | |
|     // Write to file
 | |
|     FILE* file = fopen("test1.exi", "wb");
 | |
|     if (!file) {
 | |
|         printf("Cannot create output file\n");
 | |
|         free(binary_data);
 | |
|         return -1;
 | |
|     }
 | |
|     
 | |
|     size_t written = fwrite(binary_data, 1, binary_len, file);
 | |
|     fclose(file);
 | |
|     free(binary_data);
 | |
|     
 | |
|     if (written != binary_len) {
 | |
|         printf("Write error\n");
 | |
|         return -1;
 | |
|     }
 | |
|     
 | |
|     printf("Successfully created test1.exi with %zu bytes\n", binary_len);
 | |
|     
 | |
|     // Show first few bytes for verification
 | |
|     printf("First 16 bytes: ");
 | |
|     FILE* verify = fopen("test1.exi", "rb");
 | |
|     if (verify) {
 | |
|         for (int i = 0; i < 16 && i < binary_len; i++) {
 | |
|             int c = fgetc(verify);
 | |
|             printf("%02X ", c);
 | |
|         }
 | |
|         fclose(verify);
 | |
|     }
 | |
|     printf("\n");
 | |
|     
 | |
|     return 0;
 | |
| } |