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 }); }
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); }
public static void TermToBinary(EndianBinaryWriter writer, IExtTerm term, bool addMarker = true) { if (addMarker) { writer.Write(TermStartMarker); } term.Write(writer); }
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 }); }
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, }); }