这是使用File对象把可见十六进制与文件互转的一个函数。
;文件转十六进制 file2hex(file){ tmp_file := FileOpen(file, "r") while not tmp_file.AtEOF { ;没有到结尾 tmp_file.RawRead(Data, 1) tmp_hex := SubStr("00" . ToBase(Asc(Data),16),-1) hex = % hex tmp_hex } tmp_file.Close() return hex } ;十六进制转文件 比如hex=313233 ,文件内容则为123 hex2file(hex,file){ tmp_file := FileOpen(file, "w") if (Mod(StrLen(hex),2)=1) ;不是双数长度 return -1 while hex { StringLeft, tmp_hex, hex, 2 StringTrimLeft, hex,hex, 2 tmp_hex := "0x" tmp_hex tmp_file.WriteUChar(tmp_hex) } tmp_file.Close() tmp_file = } ;进制转换函数 ToBase(n,b){ return (n < b ? "" : ToBase(n//b,b)) . ((d:=Mod(n,b)) < 10 ? d : Chr(d+55)) }
;调用测试示例 a := ClipboardAll ;赋值 ;两种方法测试耗时 oldtime := A_TickCount test1 := HexOut(a) ;方法1 time1 := A_TickCount-oldtime oldtime := A_TickCount test2 := HexOut2(a) ;方法2 time2 := A_TickCount-oldtime ;MsgBox, 64, 提示, 方法1:%test1%`n耗时:%time1%ms`n`n方法2:%test2%`n耗时:%time2%ms MsgBox, 64, 提示, 方法1耗时:%time1%ms`n`n方法2耗时:%time2%ms HexOut(var,h:=0){ u := A_IsUnicode ? 2 : 1 ;Unicode版ahk字符长度是2 hex := {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:"A",11:"B",12:"C",13:"D",14:"E",15:"F"} ;预置0-F的十六进制值 Loop % StrLen(var) ;循环变量的长度/次 { char := NumGet(var, (A_index-1)*u, "UChar") ;内存读取无格式单字节Asc值 ;串接 out .= hex[Floor(char/16)] hex[mod(char,16)] ;十进制转十六进制 Floor向下取整第二位 mod取余数第一位 并分别十六进制 } if h = 1 Return "0x" out ;返回0xFF格式 Else Return out ;返回FF格式 } HexOut2(var,h:=0){ u := A_IsUnicode ? 2 : 1 Loop % StrLen(var) ;循环变量的长度/次 { char := NumGet(&var, (A_index-1)*u, "UChar") ;内存读取无格式单字节Asc值 ;串接十六进制 SetFormat, IntegerFast, hex StringReplace, char, char, 0x, , All SetFormat, IntegerFast, d out .= StrLen(char)=2 ? char : "0" char } if h = 1 Return "0x" out ;返回0xFF格式 Else Return out ;返回FF格式 }
之前写一个gui,需要嵌入图片到ahk代码,但HEX太长,所以有了这么一个压缩脚本
zip(a){ ;自定义设置 size = 2 ;多少字节一取样 比如24为bmp 6字节 ;完毕 last = Loop { if a = { if times > 1 out = % out "[" times "_" last "]" Else out = % out last Break } StringLeft, tmp_var, a, %size% StringTrimLeft, a, a, %size% if tmp_var <> %last% { if last = { last := tmp_var times = 1 } Else { if times > 1 { out = % out "[" times "_" last "]" last := tmp_var times = 1 } Else { out = % out last last := tmp_var times = 1 } } } Else { times += 1 } } return %out% } unzip(a){ StringSplit, var, a, ] Loop % var0-1 { tmp_var = % var%A_Index% StringSplit, key, tmp_var, [ StringSplit, xx, key2, _ unzip_var = Loop % xx1 { unzip_var = % unzip_var xx2 } out = % out key1 unzip_var } out := out var%var0% Return out } file2hex(file){ tmp_file := FileOpen(file, "r") while not tmp_file.AtEOF { tmp_file.RawRead(Data, 1) SetFormat, IntegerFast, hex tmp_hex := asc(Data) StringReplace, tmp_hex, tmp_hex, 0x, , All SetFormat, IntegerFast, d if StrLen(tmp_hex) = 1 tmp_hex = 0%tmp_hex% hex = % hex tmp_hex } tmp_file.Close() Return hex } hex2file(hex,file){ tmp_file := FileOpen(file, "w") StringLen, len, hex loop % len/2 { if blob = break StringLeft, tmp_hex, blob, 2 StringTrimLeft, blob, blob, 2 tmp_hex := "0x" tmp_hex tmp_file.WriteUChar(tmp_hex) } tmp_file.Close() tmp_file = } a := file2hex("D:\Desktop\no.bmp") zip := zip(a) FileAppend, %zip%, zip.txt b := unzip(zip) hex2file(b,"out.txt")
49 queries in 1.102 seconds |