您当前的位置: 首页 >  算法

寒冰屋

暂无认证

  • 2浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

使用Notepad++插件调试算法

寒冰屋 发布时间:2022-08-14 22:58:35 ,浏览量:2

目录

介绍

背景

使用代码

兴趣点

  • 下载 DLL - 116.1 KB
  • 下载源 - 285.6 KB
介绍

有时,我有一个想法,一个算法。有时,该算法与密码学或编码有关,我想直接尝试而无需编写接口……因为算法很有趣,而接口则不然。

于是我想:为什么不用Notepad++作为界面呢?这就是为什么我最终为Notepad++编写了一个插件(从这里开始我将其称为Npp)。然后我修改了它(Npp插件),这样它也允许他的插件......很奇怪,对吧?所以,现在,当我想测试一个算法时,我需要两件事:

  1. 这里介绍的Npp插件
  2. 一个包含我要测试的算法的新DLL,在继承一个非常简单的接口的类中定义(在Npp插件中定义)
背景

这个Npp插件是使用Npp插件模板v0.94.00创建的:https ://github.com/kbilsted/NotepadPlusPlusPluginPack.Net/releases/ 然后修复了几个功能。

使用的Notepad++版本是Npp 8.3.3,64位。

使用代码

该插件的主干由插件模板自动生成的标准插件类构成。这些类可以在“PluginInfrastructure”文件夹中找到。

主要部分由非常简单的接口IEncoder组成,以及它在Main.cs中的使用方式。

接口是这样的:

public interface IEncoder
    {
    string Name { get; }
    bool NeedPassword { get; }
    string Encode(string cleartext, string pass);
    string Decode(string encodedtext, string pass);
    }

Encode和decode是我必须实现来测试我的算法的方法(如果不需要密码,参数'pass'可能是一个空字符串);'Name'显然是算法名称,将用于在Npp中创建菜单条目;'NeedPassword',如果true将打开一个小框询问密码(编码和解码时)。

测试算法所需要做的就是执行以下两个操作之一:

  • 创建(如前所述)一个新的ClassLibrary DLL,其中至少包含一个继承自该接口的类,并将其与插件DLL放在一起...
  • 或者,如果你真的很懒,直接在这个Npp插件中添加那个类

'Encoders '文件夹中提供了一个从'IEncoder'接口继承的类的示例:'EncoderBase64.cs ':

class EncoderBase64 : IEncoder
    {
    public string Name => "Base64";
    public bool NeedPassword => false;

    public string Encode(string cleartext, string pass)
        {
        byte[] data = Encoding.UTF8.GetBytes(cleartext);
        string result = Convert.ToBase64String(data);
        return result;
        }

    public string Decode(string encodedtext, string pass)
        {
        byte[] data = Convert.FromBase64String(encodedtext);
        string result = Encoding.UTF8.GetString(data);
        return result;
        }
    }

我以.NET Framework已经提供的Base64编码算法为例。如您所见,它非常简单。

现在,您将如何使用/测试它?

  1. 转到Npp插件文件夹:'C:\Program Files\Notepad++\plugins'。
  2. 创建一个新文件夹(例如,命名为“编码器”)。
  3. 复制该文件夹中的“Encoders.dll ”。
  4. 然后,您可以选择将包含从“IEncoder”继承的上述类的算法DLL(一个或多个)放在这里。
  5. 打开Notepad++。

在插件菜单中,您应该找到一个名为“Encodings”的条目,其中包含您创建的每个编码算法的两个条目(外部DLL中的条目和您懒惰地放入编码DLL中的条目);

这两个条目将被命名为Toxxxxx和Fromxxxxxx(其中xxxxx是算法的名称,定义在Name接口的属性中。这两个条目将触发接口中定义的Encode和Decode方法。

兴趣点

在Main.cs中,有一个在插件启动时调用的CommandMenuInit方法,用于初始化提供的编码器并创建相应的菜单。

internal static void CommandMenuInit()
    {
    AddEncoders();
    AddExternalEncoders();
    }

调用的第一个方法AddEncoders将搜索在当前程序集中继承IEncoder的类,而另一个方法AddExternalEncoders将搜索相同的类,但总的来说,是同一文件夹中的外部DLL。

AddEncoders方法:

static void AddEncoders(Assembly assem = null)

使用反射在给定程序集中查找提到的类(当参数assem为时null,它使用当前程序集作为默认值)。

返回所需类的方法是在ReflectionUtils类中定义的GetChildClasses。

这样,您不需要声明使用的编码器,而只需实现它们,然后将它们放在某个地方:反射会为您找到它们。

找到编码器(继承自IEncoder的类)后,Npp菜单中会添加两个条目:

static void AddEncoder(IEncoder encoder)
    {
    PluginBase.SetCommand(countCmd++, $"To{encoder.Name}", 
          () => { ExecuteConversion(encoder.Encode, encoder.NeedPassword); });
    PluginBase.SetCommand(countCmd++, $"From{encoder.Name}", 
          () => { ExecuteConversion(encoder.Decode, encoder.NeedPassword); });
    }

单击这些菜单条目之一时,将调用该ExecuteConversion方法:

  1. 它获取Npp主窗口内容+可选地要求输入密码,
  2. 将此数据发送到算法的Encoding或Decoding方法,并且
  3. 用算法的结果替换主窗口的内容。

string originalfilecontent = GetFileContent();
string password = askPass ? UserInterfaceUtils.InputStringBox
                  ("Insert password", null, true) : "";
string modifiedfilecontent = converter(originalfilecontent, password);
SetFileContent(modifiedfilecontent);

https://www.codeproject.com/Tips/5330443/Using-Notepadplusplus-Plugin-to-Debug-Algorithms

 

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0509s