Vbscript e64(Str64) 尺寸B1(),B2() 尺寸i1、i2、i3、LLen、UNum、s2、sRet、ANums 尺寸A255(255) 出错时继续下一步 ANums=数组(65、66、67、68、69、70、71、72、73、74、75、76、77、78、79、80、81、82、83、84、85、86、87、88、89、90、97、98、99、100、101、102、103、104、105、106、107、108、109、110、111、112、113、114、116、117、118、119、120、121、122、48、49、50、51、53、54、55、56、57、43、47) 对于i1=0到255 A255(i1)=64 下一个 对于i1=0到63 A255(ANums(i1))=i1 下一个 s2=替换(Str64,vbCr,“”) s2=替换(s2,vbLf,“”) s2=替换(s2,“,”) s2=修剪(s2) LLen=Len(s2) 雷迪姆B1(LLen-1) 对于i1=1到LLen B1(i1-1)=Asc(Mid(s2,i1,1)) 下一个 '--B1现在作为数组在字符串中。 雷迪姆B2((LLen\4)*3-1) i2=0 对于i1=0到UBound(B1)步骤4 B2(i2)=(A255(B1(i1))*4)或(A255(B1(i1+1))\16) i2=i2+1 B2(i2)=(A255(B1(i1+1))和15)*16或(A255(B1(i1+2))\4) i2=i2+1 B2(i2)=(A255(B1(i1+2))和3)*64或A255(B1(i1+3)) i2=i2+1 下一个 如果B1(LLen-2)=61,则 i2=2 ElseIf B1(LLen-1)=61然后 i2=1 其他的 i2=0 如果结束 UNum=UBound(B2)-i2 雷迪姆大学(联合国大学) 对于i1=0到UBound(B2) B2(i1)=Chr(B2(i1)) 下一个 DecodeBase64=连接(B2,“”) 端函数
在VBScript中,有一种比使用code@Hackoo更简单(更快)的方法将二进制数据转换为Base64。通过使用Vbscript e64(Str64) 尺寸B1(),B2() 尺寸i1、i2、i3、LLen、UNum、s2、sRet、ANums 尺寸A255(255) 出错时继续下一步 ANums=数组(65、66、67、68、69、70、71、72、73、74、75、76、77、78、79、80、81、82、83、84、85、86、87、88、89、90、97、98、99、100、101、102、103、104、105、106、107、108、109、110、111、112、113、114、116、117、118、119、120、121、122、48、49、50、51、53、54、55、56、57、43、47) 对于i1=0到255 A255(i1)=64 下一个 对于i1=0到63 A255(ANums(i1))=i1 下一个 s2=替换(Str64,vbCr,“”) s2=替换(s2,vbLf,“”) s2=替换(s2,“,”) s2=修剪(s2) LLen=Len(s2) 雷迪姆B1(LLen-1) 对于i1=1到LLen B1(i1-1)=Asc(Mid(s2,i1,1)) 下一个 '--B1现在作为数组在字符串中。 雷迪姆B2((LLen\4)*3-1) i2=0 对于i1=0到UBound(B1)步骤4 B2(i2)=(A255(B1(i1))*4)或(A255(B1(i1+1))\16) i2=i2+1 B2(i2)=(A255(B1(i1+1))和15)*16或(A255(B1(i1+2))\4) i2=i2+1 B2(i2)=(A255(B1(i1+2))和3)*64或A255(B1(i1+3)) i2=i2+1 下一个 如果B1(LLen-2)=61,则 i2=2 ElseIf B1(LLen-1)=61然后 i2=1 其他的 i2=0 如果结束 UNum=UBound(B2)-i2 雷迪姆大学(联合国大学) 对于i1=0到UBound(B2) B2(i1)=Chr(B2(i1)) 下一个 DecodeBase64=连接(B2,“”) 端函数,vbscript,icons,desktop,ico,.ico,Vbscript,Icons,Desktop,Ico,.ico,在VBScript中,有一种比使用code@Hackoo更简单(更快)的方法将二进制数据转换为Base64。通过使用MSXML2.DOMDocument类,您可以利用Microsoft对Base64的实现。下面是一个脚本,它获取一个二进制文件c:\test.jpg,并将其转换为Base64。生成的Base64编码字符串保存在文本文件中(c:\out.txt)。它使用ADO流将文件读入二进制数组,然后将其传递给例程,该例程使用DOMDocument将二进制数据转换为Base64编码的文本 Cons
MSXML2.DOMDocument
类,您可以利用Microsoft对Base64的实现。下面是一个脚本,它获取一个二进制文件c:\test.jpg
,并将其转换为Base64。生成的Base64编码字符串保存在文本文件中(c:\out.txt
)。它使用ADO流
将文件读入二进制数组,然后将其传递给例程,该例程使用DOMDocument
将二进制数据转换为Base64编码的文本
Const BINARY_FILE = "c:\test.jpg"
Const BASE64_FILE = "c:\out.txt"
With CreateObject("Scripting.FileSystemObject").CreateTextFile(BASE64_FILE, True)
.Write BinaryFileToBase64(BINARY_FILE)
.Close
End With
Function BinaryFileToBase64(strFileName)
With CreateObject("ADODB.Stream")
.Type = 1 ' Specify binary data (adTypeBinary)
.Open
.LoadFromFile strFileName
BinaryFileToBase64 = Base64Encode(.Read) ' Read binary contents into VT_UI1 | VT_ARRAY
End With
End Function
' This function accepts binary (VT_UI1 | VT_ARRAY) data and converts it to Base64-encoded text (Unicode string).
Function Base64Encode(BinaryData) ' As String
With CreateObject("MSXML2.DOMDocument.3.0").CreateElement("Base64")
.DataType = "bin.base64" ' Set the type of data the element should store
.NodeTypedValue = BinaryData ' Write the binary data
Base64Encode = .Text ' Read it back as text
End With
End Function
因此,您可以使用此脚本将任何二进制文件转换为其Base64编码的字符串表示形式。例如,这是堆栈溢出的图标,另存为12x15位图:
Qk1SAgAAAAAAADYAAAAoAAAADAAAAA8AAAABABgAAAAAABwCAAAAAAAAAAAAAAAAAAAAAAAA
hoOChoOChoOChoOChoOChoOChoOChoOChoOChoOC3uPl3uPlhoOC3uPl3uPl3uPl3uPl3uPl
3uPl3uPl3uPlhoOC3uPl3uPlhoOC3uPlhoOChoOChoOChoOChoOChoOC3uPlhoOC3uPl3uPl
hoOC3uPl3uPl3uPl3uPl3uPl3uPl3uPl3uPlhoOC3uPl3uPlhoOC3uPlcIyocIyocIyocIyo
cIyocIyo3uPlhoOC3uPl3uPlhoOC3uPl3uPl3uPl3uPl3uPlwtTdn8DV3uPlhoOC3uPl3uPl
3uPl3uPl2uHknL/UcafJVpfCVJbCbKPI3uPl3uPl3uPl3uPl3+Tm3+TmVZfCXJvEeKvLr8na
3+Tmbq7cVKHZ3+Tm3+Tm3+Tm4eXn4eXn3ePm4eXn4eXnsM3iP5fYQZjXs8/jV6Tx097o4eXn
4ubo4ubo4ubo3uToY6jbN5PXdbLc3eToOJb0K4/0e63vdqrw4+fp4+fp4+fpQZjYRZvYwNbl
3uXpOJb0LZD00t7qMYP1lLvu5Ojq5Ojq5OjqxNjm5Ojq3+bqOpf0LpH01uHrcafwPInz5Ojq
5enr5enr5enr5enr5enrRJzzLpH01+Lr3OTrMIP1psbu5enr5+rs5+rs5+rs5+rs5+rsrs7u
3eXs5+rsZqLyQ4705+rs5+rs6Ovt6Ovt6Ovt6Ovt6Ovt6Ovt6Ovt6OvtN4f0s83v6Ovt6Ovt
要解码Base64编码的字符串,我们只需要反向执行这些步骤。首先,我们将文本解码回其原始二进制形式。然后,我们将二进制数据写入一个文件
CONST NEW_BINARY_FILE = "c:\test2.jpg"
With CreateObject("Scripting.FileSystemObject").OpenTextFile(BASE64_FILE)
Base64ToBinaryFile .ReadAll(), NEW_BINARY_FILE
.Close
End With
Sub Base64ToBinaryFile(strBase64, strFileName)
With CreateObject("ADODB.Stream")
.Type = 1 ' adTypeBinary
.Open
.Write Base64Decode(strBase64) ' Write the byte array
.SaveToFile strFileName, 2 ' Overwrite if file exists (adSaveCreateOverWrite)
End With
End Sub
Function Base64Decode(ByVal strText) ' As ByteArray
With CreateObject("MSXML2.DOMDocument.3.0").CreateElement("Base64")
.DataType = "bin.base64"
.Text = strText
Base64Decode = .NodeTypedValue
End With
End Function
那么,回到您最初的问题,如何在VBScript文件中嵌入二进制(ICO
)文件?您可以将Base64字符串添加到某个位置。把它放在结尾,开始,中间的某个地方。当然,它需要被注释掉,因为它不是有效的VBScript。您可能需要添加一个开始和结束分隔符,以便知道它的开始和结束位置。例如:
' Read ourself...
With CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.ScriptFullName)
' Look for the "start"...
Do Until .AtEndOfStream
strLine = .ReadLine()
If strLine = "' ~END~" Then fRead = False
If fRead Then strBase64 = strBase64 & Mid(strLine, 3)
If strLine = "' ~START~" Then fRead = True
Loop
End With
' Re-create our bitmap!
Base64ToBinaryFile strBase64, "c:\stack_overflow.bmp"
' ~START~
' Qk1SAgAAAAAAADYAAAAoAAAADAAAAA8AAAABABgAAAAAABwCAAAAAAAAAAAAAAAAAAAAAAAA
' hoOChoOChoOChoOChoOChoOChoOChoOChoOChoOC3uPl3uPlhoOC3uPl3uPl3uPl3uPl3uPl
' 3uPl3uPl3uPlhoOC3uPl3uPlhoOC3uPlhoOChoOChoOChoOChoOChoOC3uPlhoOC3uPl3uPl
' hoOC3uPl3uPl3uPl3uPl3uPl3uPl3uPl3uPlhoOC3uPl3uPlhoOC3uPlcIyocIyocIyocIyo
' cIyocIyo3uPlhoOC3uPl3uPlhoOC3uPl3uPl3uPl3uPl3uPlwtTdn8DV3uPlhoOC3uPl3uPl
' 3uPl3uPl2uHknL/UcafJVpfCVJbCbKPI3uPl3uPl3uPl3uPl3+Tm3+TmVZfCXJvEeKvLr8na
' 3+Tmbq7cVKHZ3+Tm3+Tm3+Tm4eXn4eXn3ePm4eXn4eXnsM3iP5fYQZjXs8/jV6Tx097o4eXn
' 4ubo4ubo4ubo3uToY6jbN5PXdbLc3eToOJb0K4/0e63vdqrw4+fp4+fp4+fpQZjYRZvYwNbl
' 3uXpOJb0LZD00t7qMYP1lLvu5Ojq5Ojq5OjqxNjm5Ojq3+bqOpf0LpH01uHrcafwPInz5Ojq
' 5enr5enr5enr5enr5enrRJzzLpH01+Lr3OTrMIP1psbu5enr5+rs5+rs5+rs5+rs5+rsrs7u
' 3eXs5+rsZqLyQ4705+rs5+rs6Ovt6Ovt6Ovt6Ovt6Ovt6Ovt6Ovt6OvtN4f0s83v6Ovt6Ovt
' ~END~
使用Windows内置CERTUTIL命令可能有一种更简单的方法:
dim fso : set fso=CreateObject("scripting.FileSystemObject")
dim wsh : set wsh=CreateObject("wscript.shell")
'--- Extract ICO file...
iconFile=fso.GetSpecialFolder(2) & "\icon"
set f=fso.OpenTextFile(WScript.ScriptFullName)
s=replace(f.ReadAll,"' ","")
f.close
set f=fso.OpenTextFile(iconFile & ".tmp",2,TRUE)
f.writeline(s)
f.close
wsh.run "certutil -decode " & iconFile & ".tmp" & " " & iconFile & ".ico",0,true
' --- This is the output of the CERTUTIL encode command:
' -----BEGIN CERTIFICATE-----
' AAABAAYAEBAAAAAACABoBQAAZgAAACAgAAAAAAgAqAgAAM4FAAAwMAAAAAAIAKgO
' AAB2DgAAEBAAAAAAIABoBAAAHh0AACAgAAAAACAAqBAAAIYhAAAwMAAAAAAgAKgl
' ..
' ..
' AAAAHwAA/AAAAAA/AAD+AAAAAH8AAP+AAAAA/wAA/8AAAAP/AAD/4AAAB/8AAP/4
' AAAf/wAA//4AAH//AAD//8AD//8AAA==
' -----END CERTIFICATE-----
我可以想出几个办法。如果使用的是
WSF
,则可以将二进制数据作为Base64嵌入CDATA
部分。或者,您可以使用常规的VBS
文件,并在脚本后嵌入Base64作为注释。在任何一种情况下,您都只需要读取Base64并将其转换为二进制,然后将其写入ICO
文件。感谢您的快速响应。你知道我在哪里可以找到你提到的第二种选择的例子吗?我尝试用谷歌搜索它,但到目前为止,我只找到了将Base64数据转换为文本字符串的方法。
dim fso : set fso=CreateObject("scripting.FileSystemObject")
dim wsh : set wsh=CreateObject("wscript.shell")
'--- Extract ICO file...
iconFile=fso.GetSpecialFolder(2) & "\icon"
set f=fso.OpenTextFile(WScript.ScriptFullName)
s=replace(f.ReadAll,"' ","")
f.close
set f=fso.OpenTextFile(iconFile & ".tmp",2,TRUE)
f.writeline(s)
f.close
wsh.run "certutil -decode " & iconFile & ".tmp" & " " & iconFile & ".ico",0,true
' --- This is the output of the CERTUTIL encode command:
' -----BEGIN CERTIFICATE-----
' AAABAAYAEBAAAAAACABoBQAAZgAAACAgAAAAAAgAqAgAAM4FAAAwMAAAAAAIAKgO
' AAB2DgAAEBAAAAAAIABoBAAAHh0AACAgAAAAACAAqBAAAIYhAAAwMAAAAAAgAKgl
' ..
' ..
' AAAAHwAA/AAAAAA/AAD+AAAAAH8AAP+AAAAA/wAA/8AAAAP/AAD/4AAAB/8AAP/4
' AAAf/wAA//4AAH//AAD//8AD//8AAA==
' -----END CERTIFICATE-----