public static void Decode(Car car,
DirectBuffer directBuffer,
int bufferOffset,
int actingBlockLength,
int actingVersion)
{
var buffer = new byte[128];
var sb = new StringBuilder();
// position the car flyweight just after the header on the DirectBuffer
car.WrapForDecode(directBuffer, bufferOffset, actingBlockLength, actingVersion);
// decode the car properties on by one, directly from the buffer
sb.Append("\ncar.templateId=").Append(Car.TemplateId);
sb.Append("\ncar.schemaVersion=").Append(Car.SchemaVersion);
sb.Append("\ncar.serialNumber=").Append(car.SerialNumber);
sb.Append("\ncar.modelYear=").Append(car.ModelYear);
sb.Append("\ncar.available=").Append(car.Available);
sb.Append("\ncar.code=").Append(car.Code);
sb.Append("\ncar.someNumbers=");
for (int i = 0, size = Car.SomeNumbersLength; i < size; i++)
{
sb.Append(car.GetSomeNumbers(i)).Append(", ");
}
sb.Append("\ncar.vehicleCode=");
var vehicleCode = new byte[Car.VehicleCodeLength];
car.GetVehicleCode(vehicleCode, 0);
sb.Append(Encoding.GetEncoding(Car.VehicleCodeCharacterEncoding).GetString(vehicleCode, 0, Car.VehicleCodeLength));
OptionalExtras extras = car.Extras;
sb.Append("\ncar.extras.cruiseControl=").Append((extras & OptionalExtras.CruiseControl) == OptionalExtras.CruiseControl); // this is how you can find out if a specific flag is set in a flag enum
sb.Append("\ncar.extras.sportsPack=").Append((extras & OptionalExtras.SportsPack) == OptionalExtras.SportsPack);
sb.Append("\ncar.extras.sunRoof=").Append((extras & OptionalExtras.SunRoof) == OptionalExtras.SunRoof);
Engine engine = car.Engine;
sb.Append("\ncar.engine.capacity=").Append(engine.Capacity);
sb.Append("\ncar.engine.numCylinders=").Append(engine.NumCylinders);
sb.Append("\ncar.engine.maxRpm=").Append(engine.MaxRpm);
sb.Append("\ncar.engine.manufacturerCode=");
for (int i = 0, size = Engine.ManufacturerCodeLength; i < size; i++)
{
sb.Append((char)engine.GetManufacturerCode(i));
}
int length = engine.GetFuel(buffer, 0, buffer.Length);
sb.Append("\ncar.engine.fuel=").Append(Encoding.ASCII.GetString(buffer, 0, length)); // string requires a bit of work to decode
sb.Append("\ncar.engine.Efficiency=").Append(engine.Efficiency);
sb.Append("\ncar.engine.BoosterEnabled=").Append(engine.BoosterEnabled);
sb.Append("\ncar.engine.Booster.BoostType=").Append(engine.Booster.BoostType);
sb.Append("\ncar.engine.Booster.HorsePower=").Append(engine.Booster.HorsePower);
// The first way to access a repeating group is by using Next()
var fuelFiguresGroup = car.FuelFigures;
while (fuelFiguresGroup.HasNext)
{
var fuelFigures = fuelFiguresGroup.Next();
sb.Append("\ncar.fuelFigures.speed=").Append(fuelFigures.Speed);
sb.Append("\ncar.fuelFigures.mpg=").Append(fuelFigures.Mpg);
sb.Append("\ncar.fuelFigures.UsageDescription=").Append(Encoding.GetEncoding(Car.FuelFiguresGroup.UsageDescriptionCharacterEncoding).GetString(fuelFigures.GetUsageDescriptionBytes()));
}
// The second way to access a repeating group is to use an iterator
foreach (Car.PerformanceFiguresGroup performanceFigures in car.PerformanceFigures)
{
sb.Append("\ncar.performanceFigures.octaneRating=").Append(performanceFigures.OctaneRating);
// The third way to access a repeating group is loop over the count of elements
var accelerationGroup = performanceFigures.Acceleration;
for (int i = 0; i < accelerationGroup.Count; i++)
{
var acceleration = accelerationGroup.Next();
sb.Append("\ncar.performanceFigures.acceleration.mph=").Append(acceleration.Mph);
sb.Append("\ncar.performanceFigures.acceleration.seconds=").Append(acceleration.Seconds);
}
}
// variable length fields
sb.Append("\ncar.manufacturer.semanticType=").Append(Car.ManufacturerMetaAttribute(MetaAttribute.SemanticType));
length = car.GetManufacturer(buffer, 0, buffer.Length);
sb.Append("\ncar.manufacturer=").Append(Encoding.GetEncoding(Car.ManufacturerCharacterEncoding).GetString(buffer, 0, length));
length = car.GetModel(buffer, 0, buffer.Length);
sb.Append("\ncar.model=").Append(Encoding.GetEncoding(Car.ModelCharacterEncoding).GetString(buffer, 0, length));
length = car.GetActivationCode(buffer, 0, buffer.Length);
sb.Append("\ncar.activationcode=").Append(Encoding.GetEncoding(Car.ActivationCodeCharacterEncoding).GetString(buffer, 0, length));
sb.Append("\ncar.size=").Append(car.Size);
Console.WriteLine(sb.ToString());
}