예제 #1
0
 private static string PrintBool(PyBool boolean)
 {
     return("[PyBool " + boolean.Value + "]");
 }
예제 #2
0
        protected override void EncodeInternal(BinaryWriter output)
        {
            output.Write((byte)MarshalOpcode.PackedRow);
            Header.Encode(output);

            int cc = Columns.Count;

            var rawStream = new MemoryStream();
            var writer    = new BinaryWriter(rawStream);
            var reader    = new BinaryReader(rawStream);

            var sizeList = Columns.OrderByDescending(c => FieldTypeHelper.GetTypeBits(c.Type));

            foreach (Column col in sizeList)
            {
                switch (col.Type)
                {
                case FieldType.I8:
                case FieldType.UI8:
                case FieldType.CY:
                case FieldType.FileTime:
                    writer.Write(col.Value.IntValue);
                    break;

                case FieldType.I4:
                case FieldType.UI4:
                    writer.Write((int)(col.Value.IntValue));
                    break;

                case FieldType.I2:
                case FieldType.UI2:
                    writer.Write((short)(col.Value.IntValue));
                    break;

                case FieldType.I1:
                case FieldType.UI1:
                    writer.Write((byte)(col.Value.IntValue));
                    break;

                case FieldType.R8:
                    writer.Write((double)(col.Value.FloatValue));
                    break;

                case FieldType.R4:
                    writer.Write((float)(col.Value.FloatValue));
                    break;

                case FieldType.Bool:
                    writer.Write((byte)(col.Value.IntValue));
                    break;

                case FieldType.Bytes:
                    writer.Write((col.Value as PyBuffer).Data);
                    break;

                case FieldType.Str:
                case FieldType.WStr:
                    col.Value.Encode(output);
                    break;

                default:
                    throw new Exception("Unsupported FieldType");
                }
            }

            long bitByte   = 0;
            byte bitOffset = 0;

            byte[] unpacked = rawStream.ToArray();
            rawStream.Close();

            foreach (Column col in Columns)
            {
                if (FieldTypeHelper.GetTypeBits(col.Type) != 1)
                {
                    continue;
                }

                PyBool value = col.Value as PyBool;

                if (bitOffset > 7)
                {
                    bitOffset = 0;
                }

                if (bitOffset == 0)
                {
                    bitByte = unpacked.Length + 1;
                    Array.Resize <byte>(ref unpacked, (int)(bitByte));
                }

                unpacked[bitByte] |= (byte)(((value.Value == true) ? 1 : 0) << bitOffset++);
            }

            rawStream = new MemoryStream(unpacked);
            reader    = new BinaryReader(rawStream);

            ZeroCompress(reader, rawStream, output);

            foreach (Column col in Columns)
            {
                col.Value.Encode(output);
            }

            reader.Close();
        }
예제 #3
0
 private static string PrintBool(PyBool boolean)
 {
     return "[PyBool " + boolean.Value + "]";
 }