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