private Data ParseData(TftpStreamReader reader)
        {
            ushort blockNumber = reader.ReadUInt16();

            byte[] data = reader.ReadBytes(10000);
            return(new Data(blockNumber, data));
        }
        private Error ParseError(TftpStreamReader reader)
        {
            ushort errorCode = reader.ReadUInt16();
            String message   = ParseNullTerminatedString(reader);

            return(new Error(errorCode, message));
        }
        private ITftpCommand ParseInternal(byte[] message)
        {
            TftpStreamReader reader = new TftpStreamReader(new MemoryStream(message));

            ushort opcode = reader.ReadUInt16();

            switch (opcode)
            {
            case ReadRequest.OpCode:
                return(ParseReadRequest(reader));

            case WriteRequest.OpCode:
                return(ParseWriteRequest(reader));

            case Data.OpCode:
                return(ParseData(reader));

            case Acknowledgement.OpCode:
                return(ParseAcknowledgement(reader));

            case Error.OpCode:
                return(ParseError(reader));

            case OptionAcknowledgement.OpCode:
                return(ParseOptionAcknowledgement(reader));

            default:
                throw new TftpParserException("Invalid opcode");
            }
        }
        private Acknowledgement ParseAcknowledgement(TftpStreamReader reader)
        {
            ushort blockNumber = reader.ReadUInt16();

            return(new Acknowledgement(blockNumber));
        }