Пример #1
0
        public static BeamLiteralsChunk Read(EndianBinaryReader reader, uint size)
        {
            var decSize  = reader.ReadUInt32();
            var encBytes = reader.ReadBytes((int)size - 4); //-decSize size

            var decBytes = ZLibCompressor.Decompress(encBytes);

            if (decBytes.Length != decSize)
            {
                throw new ReadBytesCountException(decBytes.Length, (int)decSize);
            }

            var decReader = new EndianBinaryReader(new MemoryStream(decBytes));
            var litCount  = decReader.ReadUInt32();
            var literals  = new IExtTerm[litCount];

            for (uint i = 0; i < litCount; i++)
            {
                var litSize = decReader.ReadUInt32();
                var oldPos  = decReader.Position;
                literals[i] = BeamTerm.BinaryToTerm(decReader);
                var newPos = decReader.Position;
                if (oldPos + litSize != newPos)
                {
                    throw new Exception();
                }
            }
            return(new BeamLiteralsChunk()
            {
                Literals = literals
            });
        }
Пример #2
0
        public static IExtTerm BinaryToTerm(EndianBinaryReader reader, bool needMarker = true)
        {
            if (needMarker)
            {
                var marker = reader.ReadByte();
                if (marker != TermStartMarker)
                {
                    throw new BadTermMarkerException(marker, TermStartMarker);
                }
            }

            var      tag   = (EExtTermType)reader.ReadByte();
            IExtTerm value = tag switch
            {
                EExtTermType.List => TermList.Read(reader),
                EExtTermType.Tuple8 => TermTuple.Read(reader, ETermSize.Small),
                EExtTermType.Tuple32 => TermTuple.Read(reader, ETermSize.Large),
                EExtTermType.AtomLatin18 => TermAtom.Read(reader, EEncodingType.Latin1, ETermSize.Small),
                EExtTermType.AtomLatin116 => TermAtom.Read(reader, EEncodingType.Latin1, ETermSize.Large),
                EExtTermType.AtomUtf88 => TermAtom.Read(reader, EEncodingType.Utf8, ETermSize.Small),
                EExtTermType.AtomUtf816 => TermAtom.Read(reader, EEncodingType.Utf8, ETermSize.Large),
                EExtTermType.String => TermString.Read(reader),
                EExtTermType.Nil => TermNil.Read(),
                EExtTermType.FloatString => TermFloatString.Read(reader),
                EExtTermType.Int32 => TermInt32.Read(reader),
                EExtTermType.UInt8 => TermUInt8.Read(reader),
                EExtTermType.Big8 => TermBigNumber.Read(reader, ETermSize.Small),
                EExtTermType.Big32 => TermBigNumber.Read(reader, ETermSize.Large),
                EExtTermType.NewFloat64 => TermNewFloat64.Read(reader),
                EExtTermType.Binary => TermBinary.Read(reader),
                _ => throw new NotImplementedException($"{tag} not supported"),
            };

            return(value);
        }
Пример #3
0
        public static void TermToBinary(EndianBinaryWriter writer, IExtTerm term, bool addMarker = true)
        {
            if (addMarker)
            {
                writer.Write(TermStartMarker);
            }

            term.Write(writer);
        }
Пример #4
0
        public static TermList Read(EndianBinaryReader reader)
        {
            var len      = reader.ReadUInt32();
            var elements = new IExtTerm[len];

            for (int i = 0; i < elements.Length; i++)
            {
                elements[i] = BeamTerm.BinaryToTerm(reader, false);
            }

            var tail = BeamTerm.BinaryToTerm(reader, false);

            return(new TermList()
            {
                Elements = elements,
                Tail = tail
            });
        }
Пример #5
0
        public static TermTuple Read(EndianBinaryReader reader, ETermSize size)
        {
            var len = size switch
            {
                ETermSize.Small => reader.ReadByte(),
                ETermSize.Large => reader.ReadUInt32(),
                _ => throw new NotSupportedException(),
            };
            var elements = new IExtTerm[len];

            for (long i = 0; i < elements.LongLength; i++)
            {
                elements[i] = BeamTerm.BinaryToTerm(reader, false);
            }

            return(new TermTuple()
            {
                Elements = elements,
            });
        }