laozhhaiJohn 发表于 2021-3-20 17:36

[AutoHotKey]艰难自学之:将2进制文件读为16进制字串

艰难自学之:将2进制文件读为16进制字串,并计算该字串和源文件MD5值
一、前言:
    AutoHotKey之所以学的艰难,一是因为小众,导致用的人少,交流困难;资料少,学习困难。二是因为它是英文软件,官方的资料大多都是英文的,对于我们还有一层学习障碍;同时由于第一个小众原因,国内相应的翻译资料也少。三是同类的国内某些软件抢占了市场,用户相对较多;同时,很多用户使用易语言和易的插件,也能完成一些AutoHotKey的任务。四是AutoHotKey自身语言设计上的随性,语言设定对程序员而言太自由,反而成为初学者的噩梦。五是AutoHotKey的官方帮助文件比较粗略不详,又没有权威和详细教程,导致学起来很困难,需要用户一次次的实验从而避雷跳坑。

二、本次学习目标:
    将2进制文件转16进制字串并格式化长行短写。同时,计算该串和原文件的MD5值存txt备用。
16制串制式文本写为txt文件。
    这是我写的一个小项目当中的一个模块工具。

三、直接上代码:
/*┌=======================文件信息=========================
*||⑴程 序 员:Laoz-CTCTJCU
*||⑵程序名称:   
*||⑵版本编号:v0.01
*||⑶创建时间:2021/3/18 下午6:18:36
*||⑷当前编写:Laoz-CTCTJCU
*||⑸修改时间:2021/3/20 下午3:05:05
*||⑹描述说明:我的工具程序之1--将2进制文件转16进制字串并格式化长行短写,
*||            同时,计算该串和原文件的MD5值存txt备用.16制串制式文本写为txt文件.
*||修 饰 键:^==ctrl,!==alt,+==shift,#==win
*└========================================================
*/
#SingleInstance, Force
SendMode Input
SetWorkingDir, %A_ScriptDir%
#Include lib\lib.ahk;包含入主函数库文件

FileSelectFile, 图像文件, , , 请选择图片, 图片文件(*.jpg; *.png; *.bmp) ;选择文件
if (图像文件 = "");如果没有打开文件,暨变量为空则
    {
      MsgBox, 0, 错误, 您未选择任何文件
      Reload   ;重启脚本
    }

;;;;;1、将图片文件读为16进制字串并写入txt文件保存备用
16进制文本 := file2hex(图像文件) ;调用库函数将图片读为16进制文本串
输出文本文件 := A_Temp . "\akpngbmpjpgpcx2hextext.txt";将在系统临时目录生成文件
FileDelete, % 输出文本文件;创建一个空文件,或者若该文件有内容则清空内容
FileAppend, % 16进制文本, % 输出文本文件;将该16进制文本写入文本文件,两个变量都要加%,也是坑
Run, % 输出文本文件;打开这个文件看看
;注意,记事本打开这个文件,如果没有设置自动换行的化,会是一个长长长长长长长长长长长的行
;勾选记事本菜单-格式-自动换行之后,长行会随着记事本窗口大小进行自动的换行显示.

;;;;;2、计算该16进制字串和原始图片文件的MD5值存为txt文本文件备用
16进制文本MD5值 := MD5(16进制文本);调用函数计算md5值
Clipboard := 16进制文本MD5值 ;运算结果放到剪贴板,这句纯粹为了方便进行粘贴操作
运算结果0 := 16进制文本MD5值;运算结果赋值给变量
原始图片文件MD5值 := FileMD5( "s:\bb.png", 4) ;调用函数计算文件的md5值
Clipboard := 原始图片文件MD5值
运算结果1 := 原始图片文件MD5值
输出文本文件2 := A_Temp . "\akpngbmpjpgpcx2md5filemd5.txt";A_Temp内部变量代表系统临时文件夹
md5内容写入文本 := "字符串值:`n" . 运算结果0 . "`n" . "文件值:`n" . 运算结果1
FileDelete, % 输出文本文件2;创建一个空文件,或者若该文件有内容则清空内容
FileAppend, % md5内容写入文本, % 输出文本文件2;将该16进制文本写入文本文件
;这里注意:上面一句中两个变量都要加%,都要加啊! 这也是坑
Run, % 输出文本文件2

;;;;;3、将该字串或txt文件格式化为长行短写便于编程界面查看的格式,也就是加硬回车断行
;;;;;3-1、将该字串格式化为长行短写的格式后,写入txt文件保存
;16进制文本 := "123456789abcdef";测试下面语句用临时变量
字串长度Length := StrLen(16进制文本);计算16进制字串长度,应该是文件字节数的2倍
输出文本文件3 := A_Temp . "\akpnbmjppc2hex2formattext.txt"
FileDelete, % 输出文本文件3;创建一个空文件,或者若该文件有内容则清空内容

当前截取内容 := "( Join LTrim`;重要参数,必须保留`n`""" ;
;AutoHotKey中,转义符为“ ` ”,暨esc下面的键.
;特别注意,上面一句,正文中的";"号,需用"`"转义. 之后用"`n"表示分行
;上一句最后转义“ `"" ”内容,表示转义为“ " ”号.因为换行后下一行第一个字符为",哈哈
;AutoHotKey用两个双引号来表示一个原义的双引号
;见手册中章节:#EscapeChar (和转义序列的说明),该命令V2已经启用,可搜索转义序列
FileAppend, % 当前截取内容, % 输出文本文件3;将前导的格式先写入文本文件

一行字符数 := 80;按照80个字符一行
循环次数 := Ceil(字串长度Length / 一行字符数) ;计算要截取次数并向上取整

While, A_Index <= 循环次数;循环截取该16进制字串
    {
      截取点 := ((A_Index -1) * 一行字符数) + 1
      If (A_Index < 循环次数);非最后一行都加分行符号
            {
                当前80字符 := SubStr(16进制文本, 截取点, 一行字符数) . "`n"
            }
            Else;最后一行则不加分行符号,令行处理
            {
                当前80字符 := SubStr(16进制文本, 截取点, 一行字符数)
                当前80字符 := 当前80字符 . "`""`n)" ;将最后一行字串加收尾的字符内容
            }
      FileAppend, % 当前80字符, % 输出文本文件3 ;追加被截取的80字符
    }

Run, % 输出文本文件3
Pause
;;;;;3-2、将txt文件读入,之后格式化为长行短写的脚本适用格式后,写到另外txt文件
;;这个就不写了,累啊,有3-1的语句段就可以啦






Cashion 发表于 2021-3-20 18:28

可不,AutoHotKey还能做输入法,怎么能算小众呢

宜城小站 发表于 2021-3-20 18:30

前来学习了{:1_893:}

bwuaich 发表于 2021-3-20 19:33

恩恩; AutoHotKey确实比较难学; 谢谢分享学习

xzl2021 发表于 2021-3-20 19:38

laozhhaiJohn 发表于 2021-3-20 22:03

xzl2021 发表于 2021-3-20 19:38
你这变量名都是中文,看着真糟心。

嗯,我英文水平不高,所以用中文做变量名,自己看着好懂一些。
页: [1]
查看完整版本: [AutoHotKey]艰难自学之:将2进制文件读为16进制字串