使用Notepad++插件调试算法

目录

介绍

背景

使用代码

兴趣点


介绍

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

于是我想:为什么不用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.364位。

使用代码

该插件的主干由插件模板自动生成的标准插件类构成。这些类可以在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);
    }

Encodedecode是我必须实现来测试我的算法的方法(如果不需要密码,参数'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中的条目);

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

兴趣点

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. 将此数据发送到算法的EncodingDecoding方法,并且
  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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值