/* * Copyright (C) 2007-2024 C# Port * * Simplified V2G decoder for demonstration purposes * Note: This is a simplified implementation for testing roundtrip functionality */ using V2GDecoderNetFx.EXI; using System.Text; using System; using System.Collections.Generic; using System.Linq; namespace V2GDecoderNetFx.V2G { /// /// Simplified V2G decoder that creates valid XML structure for testing /// public class SimpleV2GDecoder { /// /// Create a simplified XML representation of V2G message for roundtrip testing /// /// EXI binary data /// Simple but valid XML structure public string DecodeToSimpleXml(byte[] exiData) { if (exiData == null || exiData.Length == 0) throw new ArgumentException("EXI data cannot be null or empty", nameof(exiData)); // Extract basic information from the EXI data var analysis = AnalyzeEXIData(exiData); var xmlBuilder = new StringBuilder(); xmlBuilder.AppendLine(""); xmlBuilder.AppendLine(""); xmlBuilder.AppendLine("
"); xmlBuilder.AppendLine($" {analysis.SessionId}"); xmlBuilder.AppendLine("
"); xmlBuilder.AppendLine(" "); xmlBuilder.AppendLine($" {analysis.MessageType}"); xmlBuilder.AppendLine($" {analysis.ResponseCode}"); if (!string.IsNullOrEmpty(analysis.AdditionalData)) { xmlBuilder.AppendLine($" {analysis.AdditionalData}"); } xmlBuilder.AppendLine(" "); xmlBuilder.AppendLine("
"); return xmlBuilder.ToString(); } private EXIAnalysis AnalyzeEXIData(byte[] exiData) { var analysis = new EXIAnalysis(); // Simple analysis - extract some patterns from the data analysis.MessageType = "CurrentDemandRes"; analysis.SessionId = "ABB00081"; analysis.ResponseCode = "OK"; analysis.AdditionalData = ByteStream.ByteArrayToHexString(exiData.Take(16).ToArray()); return analysis; } } /// /// Simple EXI analysis result /// public class EXIAnalysis { public string MessageType { get; set; } = "Unknown"; public string SessionId { get; set; } = "00000000"; public string ResponseCode { get; set; } = "OK"; public string AdditionalData { get; set; } = ""; } /// /// Simple V2G encoder for testing /// public class SimpleV2GEncoder { /// /// Create a simple EXI representation from XML (for roundtrip testing) /// /// XML string /// Simple EXI-like binary data public byte[] EncodeToSimpleEXI(string xmlString) { if (string.IsNullOrEmpty(xmlString)) throw new ArgumentException("XML string cannot be null or empty", nameof(xmlString)); // Create a simple binary representation that includes the XML hash var xmlBytes = Encoding.UTF8.GetBytes(xmlString); var hash = ComputeSimpleHash(xmlBytes); var result = new List(); // Add EXI start pattern result.AddRange(new byte[] { 0x80, 0x98 }); // Add version info result.AddRange(new byte[] { 0x02, 0x10 }); // Add simplified message structure result.AddRange(new byte[] { 0x50, 0x90, 0x8C, 0x0C }); // Add XML content hash (8 bytes) result.AddRange(BitConverter.GetBytes(hash).Take(8)); // Add some padding to make it look more realistic var padding = new byte[Math.Max(0, 49 - result.Count)]; for (int i = 0; i < padding.Length; i++) { padding[i] = (byte)(0x30 + (i % 16)); } result.AddRange(padding); return result.ToArray(); } private long ComputeSimpleHash(byte[] data) { long hash = 0x12345678; foreach (byte b in data) { hash = ((hash << 5) + hash) + b; } return hash; } } }