博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VB.NET 写的一个文件转写工具(Aquilia)
阅读量:6517 次
发布时间:2019-06-24

本文共 4562 字,大约阅读时间需要 15 分钟。

hot3.png

一、关于Aquilia

因为之前遇到过一个问题:就是有一个二进制文件,要把它保存到一个只支持ASCII字符的文本文件中,并且要做到可恢复成与之前一模一样的二进制文件。今天正好有时间,就用VB.NET写了一个程序,取名叫Aquilia,用来实现这个功能。

这个程序的源码已经上传到GitAtOSC上,地址为:

二、制作一个样本文件HelloWorld.exe

建立一个C#控制台应用程序,手动添加引用“System.Windows.Forms”,然后输入代码如下:

namespace HelloWorld{    class Program    {        static void Main(string[] args)        {            System.Windows.Forms.MessageBox.Show("Hello World!");        }    }}

编译好的exe文件即为HelloWorld.exe,这个exe在运行后会弹出一个MessageBox上面写着“Hello World!”

224444_6cqb_1425762.png

三、Aquilia代码

1)ModuleMain.vb:主函数

Imports System.IOModule ModuleMain    '''     ''' 主函数    '''     ''' 
Sub Main() Dim Args As String() = System.Environment.GetCommandLineArgs() If Args.Count <> 4 Then PrintUsage() Pause() Exit Sub End If If (Args(1) <> "-e" And Args(1) <> "--encode" And _ Args(1) <> "-d" And Args(1) <> "--decode") Then PrintUsage() Pause() Exit Sub End If If Not File.Exists(Args(2)) Then Console.WriteLine("文件:{0} 不存在", Args(2)) End If If File.Exists(Args(3)) Then Console.Write("文件:{0} 已存在,要覆盖吗 (y/n)", Args(3)) While True Dim temp As String = Console.ReadLine If temp = "Y" Or temp = "y" Then Exit While ElseIf temp = "N" Or temp = "n" Then Exit Sub Else Console.Write("文件:{0} 已存在,要覆盖吗 (y/n)", Args(3)) Continue While End If End While End If If Args(1) = "-e" Or Args(1) = "--encode" Then FileConverHelper.Encode(Args(2), Args(3)) ElseIf Args(1) = "-d" Or Args(1) = "--decode" Then FileConverHelper.Decode(Args(2), Args(3)) End If Console.WriteLine("转换完毕!") Console.WriteLine("新生成的文件已被保存到: {0}", Args(3)) Pause() End Sub ''' ''' 打印程序用法 ''' '''
Sub PrintUsage() Dim Usage(6) As String Usage(0) = "Aquilia程序使用方法" Usage(1) = "Aquilia [-e|--encode|-d|--decode] 文件1 文件2" Usage(2) = "第二个参数为-e或--encode时,Aquilia将文件1加密后写入到文件2中" Usage(3) = "第二个参数为-d或--decode时,Aquilia将文件1解密后写入到文件2中" Usage(4) = "示例参数1: -e HelloWorld.exe output.txt" Usage(5) = "示例参数2: -d output.txt HelloWorld2.exe" Console.WriteLine(Join(Usage, vbCrLf)) End Sub ''' ''' 按任意键继续 ''' '''
Sub Pause() Console.WriteLine("按任意键继续") System.Console.ReadKey() System.Console.Write(Chr(8) + " ") '删除按下的“任意键”字符 End SubEnd Module

2)FileConverHelper.vb:

Imports System.IOImports System.TextPublic Class FileConverHelper    '''     ''' 将file1内容的以文本的形式输出到file2中    '''     '''     '''     ''' 
Public Shared Sub Encode(file1 As String, file2 As String) Dim fi As FileInfo = New FileInfo(file1) Dim fs1 As New FileStream(file1, FileMode.Open, FileAccess.Read, FileShare.Read) Dim buffer(fi.Length) As Byte fs1.Read(buffer, 0, CInt(fi.Length)) fs1.Close() Using sw As New StreamWriter(file2) For i As Integer = 0 To buffer.Length - 1 If i <> buffer.Length - 1 Then sw.Write(buffer(i) & ",") Else sw.Write(buffer(i)) End If Next End Using 'Dim sb As New StringBuilder 'For Each byt In buffer ' sb.Append(byt + ",") 'Next End Sub ''' ''' 将file1文本以二进制的形式输出到file2中 ''' ''' ''' '''
Public Shared Sub Decode(file1 As String, file2 As String) Dim s() As String Using sr As New StreamReader(file1) s = sr.ReadToEnd().Split(",") End Using Dim buffer(s.Length - 1) As Byte For i As Integer = 0 To buffer.Length - 1 buffer(i) = CInt(s(i)) Next Dim fs2 As New FileStream(file2, FileMode.Create, FileAccess.Write, FileShare.None) fs2.Write(buffer, 0, buffer.Length) fs2.Close() End SubEnd Class

四、运行结果

将HelloWorld.exe复制到Aquilia.exe同一个目录下,然后输入下面两条命令

Aquilia.exe -e HelloWorld.exe output.txtAquilia.exe -d output.txt HelloWorld2.exe

先将HelloWorld.exe转码后输出到output.txt下,再把output.txt中的内容重写到HelloWorld2.exe中

225257_caAI_1425762.png

生成的output.txt内容如下:

225611_BWQN_1425762.png

重写成的HelloWorld2.exe,双击后,也会输出内容为“Hello World!”的MessageBox

225822_UZ9e_1425762.png

附:VB程序集中的“启动选项→命令行参数”,保存在文件Aquilia.vbproj.user中(Aquilia为本程序集的名称)

-e HelloWorld.exe output.txt

提交Git的时候不要忘了这个文件

END

转载于:https://my.oschina.net/Tsybius2014/blog/365321

你可能感兴趣的文章
C#彻底解决Web Browser 跨域读取Iframes内容
查看>>
【Android】ListView 优化
查看>>
高效使用hive
查看>>
为什么前端工程师的地位普遍低于后端?
查看>>
SSDB 安装部署及注意事项总结
查看>>
WPF 自定义路由事件
查看>>
代理模式
查看>>
ubuntu14 安装JDK
查看>>
C的指针
查看>>
leetcode 6. ZigZag Conversion
查看>>
Hibernate 学习之Query查询(HQL查询)
查看>>
muuarhmrc
查看>>
Qt on Android: http下载与Json解析
查看>>
Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring
查看>>
开涛spring3(2.3) - IoC的配置使用
查看>>
[PWA] Deal with caches in PWA
查看>>
w3cscholl的在线代码编辑工具2
查看>>
java的System.getProperty()获取的值
查看>>
HTTP 405 错误 – 方法不被允许 (Method not allowed)【转载】
查看>>
神经网络为什么要归一化
查看>>