If somebody is still interested in this topic, here is a draft C# implementation of a KVC conversion, based on post by Rutger.
Types handling have to be improved. Right now it works for strings, sub-kvc and ints. For other types I don't have examples on my system right now.
[code=csharp]
private Dictionary<string, object> ReadKeyValueCollection(byte[] buffer, int offset = 0)
{
var kvc = new Dictionary<string, object>();
int fp = offset;
int length = BinaryPrimitives.ReverseEndianness(BitConverter.ToInt16(buffer, fp));
fp += 2;
int pairs = BinaryPrimitives.ReverseEndianness(BitConverter.ToInt16(buffer, fp));
fp += 2;
while (fp - offset < length)
{
int type = BitConverter.ToChar(buffer, fp);
fp += 1;
int keyLength = BinaryPrimitives.ReverseEndianness(BitConverter.ToInt16(buffer, fp));
fp += 2;
var key = ASCIIEncoding.Default.GetString(buffer, fp, keyLength);
fp += keyLength;
int valueLength = BinaryPrimitives.ReverseEndianness(BitConverter.ToInt16(buffer, fp));
fp += 2;
kvc[key] = ReadValue(type, buffer, fp, valueLength);
fp += valueLength;
}
return kvc;
}
private object ReadValue(int type, byte[] buffer, int offset, int length)
{
// 0 - str, 1 - int, 2 - utf16???, 3 - lst
switch (type)
{
case 1: return ReadInt(buffer, offset, length);
case 3: return ReadKeyValueCollection(buffer, offset);
default: return ASCIIEncoding.Default.GetString(buffer, offset, length);
}
}
private object ReadInt(byte[] buffer, int offset, int length)
{
switch (length)
{
case 1: return BitConverter.ToChar(buffer, offset);
case 2: return BinaryPrimitives.ReverseEndianness(BitConverter.ToInt16(buffer, offset));
case 4: return BinaryPrimitives.ReverseEndianness(BitConverter.ToInt32(buffer, offset));
case 8: return BinaryPrimitives.ReverseEndianness(BitConverter.ToInt64(buffer, offset));
default: return BinaryPrimitives.ReverseEndianness(BitConverter.ToInt16(buffer, offset));
}
}
[/code]