feat: Complete C# EXI decoder with byte-level compatibility to OpenV2G
- Implement BitStreamExact.ReadInteger16() matching C decodeInteger16 algorithm - Add systematic position detection for optimal EXI stream alignment - Achieve 100% compatibility with C decoder for test4.exi and test5.exi - Fix EVTargetCurrent value decoding (-2 → 1, 5) through proper integer handling - Add comprehensive analysis documentation in ANALYSIS_RESULTS.md Core improvements: - Sign bit + magnitude integer decoding for negative values: -(magnitude + 1) - Automatic 6-bit choice detection for CurrentDemandReq (choice=13) - Grammar state transition matching C implementation exactly - Complete CurrentDemandReq field validation against C reference 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
		| @@ -137,10 +137,55 @@ namespace V2GDecoderNet.EXI | ||||
|             return isNegative ? -(value + 1) : value; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Read 16-bit signed integer using C decodeInteger16 algorithm | ||||
|         /// First bit is sign bit: 0=positive, 1=negative | ||||
|         /// For negative: -(magnitude + 1) | ||||
|         /// </summary> | ||||
|         public short ReadInteger16() | ||||
|         { | ||||
|             // Read sign bit (1 bit) | ||||
|             bool isNegative = ReadBit() != 0; | ||||
|              | ||||
|             // Read unsigned magnitude | ||||
|             uint magnitude = (uint)ReadUnsignedInteger(); | ||||
|              | ||||
|             if (isNegative) | ||||
|             { | ||||
|                 return (short)(-(magnitude + 1)); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 return (short)magnitude; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public bool IsEndOfStream => _stream.Position >= _stream.Size && _stream.Capacity == 0; | ||||
|          | ||||
|         public int Position => _stream.Position; | ||||
|         public int BitPosition => EXIConstantsExact.BITS_IN_BYTE - _stream.Capacity; | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Get remaining bytes from current position | ||||
|         /// </summary> | ||||
|         public byte[] GetRemainingBytes() | ||||
|         { | ||||
|             int remainingBits = _stream.Capacity; | ||||
|             int currentBytePos = Position; | ||||
|              | ||||
|             if (remainingBits > 0) | ||||
|             { | ||||
|                 // If there are remaining bits in current byte, we need to include it | ||||
|                 currentBytePos--; | ||||
|             } | ||||
|              | ||||
|             int remainingByteCount = _stream.Size - currentBytePos; | ||||
|             if (remainingByteCount <= 0) return new byte[0]; | ||||
|              | ||||
|             byte[] remaining = new byte[remainingByteCount]; | ||||
|             Array.Copy(_stream.Data, currentBytePos, remaining, 0, remainingByteCount); | ||||
|             return remaining; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 ChiKyun Kim
					ChiKyun Kim