文章关键字 ‘VB’

用VBS下载文件

2010年06月17日,星期四

Google一下关键词“VBS 下载文件”出来也是一堆一样的,你复制我的,我复制你的,复制来复制去最后不知道是谁的。不过基本都是对的了,原理都一样,使用msxml2.xmlhttp和adodb.stream对象。至于他们所说的第二种方法,使用internet.application对象下载文件,我没有测试过,不知道效果怎么样。

Sub download(url,target)
	Const adTypeBinary = 1
	Const adSaveCreateOverWrite = 2
	Dim http,ado
	Set http = CreateObject("Msxml2.XMLHTTP")
	http.open "GET",url,False
	http.send
	Set ado = createobject("Adodb.Stream")
	ado.Type = adTypeBinary
	ado.Open
	ado.Write http.responseBody
	ado.SaveToFile target
	ado.Close
End Sub

download "https://demon.tw/foo.gif","foo.gif"

代码很简单,我就不多说什么了。我好奇的是他们说这段代码杀毒软件会报毒,我没有测试过不知道会不会报毒,但是这句话表明了他们的不良企图。呵呵,原来大家都喜欢编病毒啊。

Asc/AscB/AscW和Chr/ChrB/ChrW函数之间的区别

2010年06月15日,星期二

翻译自微软帮助和支持,感谢公子的大力协助。http://support.microsoft.com/kb/145745/en-us/

概要:多年来,BASIC程序员一直使用Asc和Chr函数来访问和操作ASCII字符集。随着Unicode被主流操作系统和应用程序所接受,需要改进版本的Asc和Chr函数已经开发了。为了满足这种需求,针对Windows系统的Microsoft Visual Basic(4.0以及更高版本)包括了AscB、ChrB和AscW、ChrW函数。

更多信息:Unicode是一种为代替ANSI标准而设计的,把字符编码成数值形式的标准。因为ANSI标准只使用单个字节来代表每个字符,它受最大256个字符的限制。虽然这对于英语受众来说已经足够,但当考虑到全球软件市场时,它无法满足。使用Unicode标准,每个字符由两个字节表示,因此整个的Unicode字符集包括了65536个可能的位置。

微软的Windows NT, Windows 2000, and Microsoft OLE 2.0完全基于Unicode设计,而且Visual Basic(4.0以及更高版本)在内部使用Unicode格式来表示所有的字符串。AscW和ChrW函数允许对Unicode字符的全范围访问。这些函数和原始的Asc、Chr函数运行方式相同,唯一的区别在于新函数支持0到65536的参数,而原来的只能是0到255。许多Visual Basic对象(例如调试窗口、标签、文本框),当它们不知道怎样显示一个Unicode字符时,会返回一个“?”。

因为所有的字符串现在在内部由Unicode格式表示,它不像以前表示一个字符串里的二进制数据那样简单。使用Chr函数来分配数据给一个字符串的结果不再向以前一样。例如:

stringvar = Chr(65)

结果是一个两字节长的字符串,其中第一字节的值为65,第二字节的值为0(这是Unicode表示的字母“A”)。需要记住的是,从ANSI转换至Unicode并不总是意味着像这个例子里做的那样,仅仅添加一个值为0的第二字节。例如,大多数在130~159范围内的ANSI字符码拥有完全不同的Unicode值。尝试运行’Debug.Print AscW(Chr(130))’,然后一个8218的值会显示出来。

(更多…)

用VBS实现PHP的urlencode函数

2010年06月13日,星期日

昨天是JavaScript的,今天换成VBScript版的urlencode函数了,好吧,我承认我很无聊。我写代码之前Google过关键词“VBS urlencode函数”,结果出来的前三个链接(你搜索的结果可能和我不一样)是:。(原谅我不喜欢直接贴链接)好家伙,代码一模一样,一模一样不要紧,还都是错的。贴出来围观一下(注意这是错的)。

Function URLEncode(strURL)
    Dim I
    Dim tempStr
    For I = 1 To Len(strURL)
        If Asc(Mid(strURL, I, 1)) < 0 Then
            tempStr = "%" & Right(CStr(Hex(Asc(Mid(strURL, I, 1)))), 2)
            tempStr = "%" & Left(CStr(Hex(Asc(Mid(strURL, I, 1)))), Len(CStr(Hex(Asc(Mid(strURL, I, 1))))) - 2) & tempStr
            URLEncode = URLEncode & tempStr
        ElseIf (Asc(Mid(strURL, I, 1)) >= 65 And Asc(Mid(strURL, I, 1)) <= 90) Or (Asc(Mid(strURL, I, 1)) >= 97 And Asc(Mid(strURL, I, 1)) <= 122) Or (Asc(Mid(strURL, I, 1)) >= 48 And Asc(Mid(strURL, I, 1)) <= 57) Then
            URLEncode = URLEncode & Mid(strURL, I, 1)
        Else
            URLEncode = URLEncode & "%" & Hex(Asc(Mid(strURL, I, 1)))
        End If
    Next
End Function

连“-_.”这几个符号都一起encode,忽悠广大的人民群众么。退一步讲,假设代码是正确的吧,这代码的效率不敢恭维。我觉得我写代码已经够不讲究效率了,原来还有比我更强的人。每循环一次都要计算一次Len(strURL),然后是出现无数次的Asc(Mid(strURL, I, 1)) 。现在的人到底在想什么,难道看都不看就Ctrl+C,Ctrl+V吗?

由于不同编码的中文字符urlencode的结果是不一样的,我写了两个版本的urlencode函数,一个是ANSI版的,一个是UTF-8版的。这里的ANSI和UTF-8指的不是VBS文件保存的编码,而是指对应的PHP编码,即ANSI版的对应以gb2312编码的PHP字符串的urlencode,UTF-8版的对应以UTF-8编码的PHP字符串的urlencode。以“恶魔”为例,使用ANSI版的urlencode后输出%B6%F1%C4%A7,而UTF-8版的输出%E6%81%B6%E9%AD%94。

代码懒得贴出来了,直接下载吧,有什么问题请留言指正,目前我测试的样本都没有问题,也许是样本不够多吧。

ANSI版的urlencode

[download id=11]

UTF-8版的urlencode

[download id=12]

用VBS实现凯撒密码算法

2010年06月5日,星期六

在密码学中,恺撒密码(或称恺撒加密、恺撒变换)是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向後(或向前)按照一个固定数目进行偏移後被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

例如,当偏移量是左移3的时候(解密时的密钥就是3):

明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC

以上都是废话啦,最近在教一个小朋友VBS,给她出了一道题,让她实现凯撒密码算法,不过貌似有点难了。Google了一下凯撒密码,出来的基本都是C和Java的实现,还是我自己写吧。

Function Caesar(str,offset)
	Dim length,char,i
	Caesar = ""
	length = Len(str)
	For i = 1 To length
		char = Mid(str,i,1)
		If char >= "A" And char <= "Z" Then
			char = Asc("A") + (Asc(char) - Asc("A") + offset) Mod 26
			Caesar = Caesar & Chr(char)
		ElseIf char >= "a" And char <= "z" Then
			char = Asc("a") + (Asc(char) - Asc("a") + offset) Mod 26
			Caesar = Caesar & Chr(char)
		Else
			Caesar = Caesar & char
		End If
	Next
End Function

WScript.Echo Caesar("ABCDEFGHIJKLMNOPQRSTUVWXYZ",3)

WordPress的默认主题真不好使,代码竟然溢出了,将就着看吧,或者给我推荐一个好看点的主题也行。