private static object ReadPrimitiveValue(Stream bytes, PiffDataFormats format, Type targetType) { switch (format) { case PiffDataFormats.Int8: return((byte)bytes.ReadByte()); case PiffDataFormats.Int24: return(GetInt24(bytes)); case PiffDataFormats.Int32: return(GetInt32(bytes)); case PiffDataFormats.Int64: return(GetInt64(bytes)); case PiffDataFormats.Box: return(ReadBox(bytes, targetType)); default: throw new ArgumentException($"Format '{format}' is not yet supported for reading."); } }
public PiffDataFormatAttribute(PiffDataFormats format) { Format = format; }
/// <summary> /// Write a single value with the given format. /// </summary> private static IEnumerable <byte> WritePrimitiveValue(object value, PiffDataFormats format) { var dataBytes = new List <byte>(); switch (format) { case PiffDataFormats.Int8: dataBytes.Add((byte)value); break; case PiffDataFormats.Int16: dataBytes.AddRange(ConvertInt16ToBigEndian((short)value)); break; case PiffDataFormats.Int24: dataBytes.AddRange(ConvertInt32ToBigEndian((int)value).Skip(1)); break; case PiffDataFormats.Int32: dataBytes.AddRange(ConvertInt32ToBigEndian((int)value)); break; case PiffDataFormats.UInt32: dataBytes.AddRange(ConvertUnsignedInt32ToBigEndian((uint)value)); break; case PiffDataFormats.Int64: dataBytes.AddRange(ConvertInt64ToBigEndian((long)value)); break; case PiffDataFormats.DynamicInt: dataBytes.AddRange(ConvertInt32ToDynamic((int)value)); break; case PiffDataFormats.Int2Minus1: dataBytes.Add((byte)(((byte)value - 1) | 0xFC)); break; case PiffDataFormats.Int5: dataBytes.Add((byte)((byte)value | 0xE0)); break; case PiffDataFormats.Ascii: dataBytes.AddRange(Encoding.ASCII.GetBytes((string)value)); break; case PiffDataFormats.Utf8Zero: dataBytes.AddRange(Encoding.UTF8.GetBytes((string)value)); dataBytes.Add(0); break; case PiffDataFormats.Ucs2: dataBytes.AddRange(Encoding.Unicode.GetBytes((string)value)); break; case PiffDataFormats.GuidBytes: // Need reformatting dataBytes.AddRange(((Guid)value).ToBigEndianArray()); break; case PiffDataFormats.InlineObject: // Write the object dataBytes.AddRange(CollectPropertiesForWriting(value).SelectMany(p => WriteValue(p))); break; case PiffDataFormats.Box: dataBytes.AddRange(WriteBoxObject(value)); break; default: throw new ArgumentException($"Unsupported format '{format}'."); } return(dataBytes); }