Exemple #1
0
        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;
 }
Exemple #3
0
        /// <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);
        }