VB 深度下潜之 海蛇缠绕
下潜深度(十米,水温0°C),时间北京时间零点整。
“海蛇”有人在惊呼。
只见在海底深处游来一条黑色的长长的海蛇,几乎所有的人都在发呆。但是海蛇说了一句让我们胆寒的话“我就是有名的VB字符串,如果你们继续下潜的话,就得想通过我”。
我习惯性的观察着它,因为我知道要打败一个对手,就必须深入的了解对手。
因此我写了一段小CODE来了解它。
Dim str As String
str = "Give me a 美女"
Dim L1 As Long
Dim L2 As Long
L1 = Len(str)
L2 = LenB(str)
Debug.Print L1, L2
这个代码运行得很好,完全符合我的想像,在立即窗口中显示了12,24,
Good,于是我准备在窗口中用TextOut把它打印出来,至于为什么我一定要这个函数而不用其它的,你管得着么?所以我写下了于下代码
Dim str As String
str = "Give me a 美女"
Dim L1 As Long
Dim L2 As Long
L1 = Len(str)
L2 = LenB(str)
Debug.Print L1, L2
TextOut Me.hDC, 100, 100, str, L1
结果我发现不对?看来是字符串长度不对,想起来了,在VB中字符串是BSTR型的,那么应该用L2作长度,对不对呢,试试就知道了。
天呀,在字符串后出现了天书,难道是上帝在暗示我什么时候给我一个美女?
不过我想上帝没有这么快就会答应我,因此一定是我的代码有问题。
当我正在沉思的时候,所有的人都在观注着我。没办法,太帅了。
所以我又迅速写下了以下的代码
Private Declare Function LenANSI Lib "kernel32" Alias "lstrlenA" (ByVal string1 As String) As Long
……
Dim str As String
str = "Give me a 美女"
Dim TrueLen As Long
TrueLen = LenANSI(str)
TextOut Me.hDC, 100, 100, str, TrueLen
当我快速地按下F5后,天空中便有了回响,“Give me a 美女”这句话已得到了正确的响应。
这时候我看着这条海蛇,满有信心地向它游去,但是它却很诡秘的一笑。
你见过蛇的笑容么,它也很缓缓的游过来了。
“如果你们打算就这样通过我的话,也想得太容易了”这句话为什么这么熟悉呢。是不是在黄金十二宫里的什么人说的吧,
“给你们一个小考验,你们知道vbNullString 和 “” 有什么区别么?”
“别以为你是海蛇就了不起,你这问题也太简单了吧”我身边一个长得不是很难看的小伙子,人送外号(天下第七帅),“你以为我没读过海洋生物指南呀(对象浏览器)
Const vbNullString = ""
VBA.Constants 的成员
当调用一个外部过程,需要一个非零值的字符串时,所使用的常数
“那你的意思是说是一样的了,那么vbNullChar呢?”海蛇不怀好意地看着天下第七帅。
“那当然是一样的了,你看VB的说明么”天下第七帅冲口而出,不过他又觉得好象有些不对。但是VB的对象浏览器上的确写着
Const vbNullChar = ""
VBA.Constants 的成员
那么下面这段代码代表什么呢?
海蛇给出了它的代码
Dim s1 As String
Dim s2 As String
Dim s3 As String
s1 = vbNullString
s2 = vbNullChar
s3 = ""
Debug.Print StrPtr(s1), StrPtr(s2), StrPtr(s3)
Debug.Print LenB(s1), LenB(s2), LenB(s3)
天下第七帅按下F5后,他很惊讶海蛇代码的运行结果
0 1899284 1434596
0 2 0
那么就是说VB的说明和海蛇之间一定有人错了。而且,对于采用S1两个值都是零,指针指向零,长度为零,它不是一个普通意义上的零值呀。
天下第七帅于是转过头来看着我。
“小子,出风头吧,来吧,我先给你们看点东西”
“你们想要打败海蛇,就一定要了解海蛇的结构”
VB的字符串是一个标准的BSTR字符串,比如说”Hello”这个字符串它的结构是这样的
A |
0 |
0 |
0 |
‘H’ |
0 |
‘e’ |
0 |
‘l’ |
0 |
‘l’ |
0 |
‘o’ |
0 |
0 |
0 |
可以看到前面四个字节代表 字符串实际长度所占字节数,它是一个Long值。
而最后两个字节是代表零值的结尾字符。
而中间的十个字节正好是字符串的内容。
如果我们用s1=”Hello”,那么s1是指向什么地方呢。
“最初我以为s1是指向第一个字节,但是当我用自编的VB内存观测工具来看strptr(s1)后面所跟的字节值时发现,s1是指向第五个字节,也就是我们字符串真正开始的地方。”
“大家都了解了海蛇的结构了,那么它刚才提出的三种情况为什么会有不同呢?”我向还在发呆的下潜者。
“是呀,为什么?”
好了,拿出你们的OleView,在File-> View TypeLib中打开VB6.DLL,你是不是看到了一个很奇妙的天地,别发呆,找到以下部分
Modules->Modules Constants
打开他们你便会看到VB内部真正的定义了。
[helpcontext(0x0010aa32)] const LPSTR vbNullString = "";
[helpcontext(0x0010aa32)] const LPSTR vbNullChar = "/0";
看到了没有,vbNullString指向一个空字串,但这个空字串是零址的。而vbNullChar则是一个零字符(相当于C中字符串中最后一个字符)。那么我们来看海蛇的代码运行时发生了什么
s1 = vbNullString
VB看到这句时,它很清楚把S1的值变成了零
s2 = vbNullChar
VB看到这句时,它做了几个动作,它用SysAllocStringLen在堆中分配了一个BSTR字符串,然后将’/0’复制到这个字符串里。
s3 = ""
这里VB做了很多工作,首先,VB在编译时,把””当成了一个常量,它必须为这个空字符串内部申请一个变量。当EXE文件加载后,也得把它设定一个地址,虽然它什么都不代表
是一个 00 00 00 00 00 00 这样的字符串,它需要6个字节(四个头字节和2个尾字节)
然后当看到这句时再把第五个字节的地址值传给s3
所以,虽然你只是信手写了一个””,结果VB多作了很多工作。6个字节虽然不多,但是在一个大工程里,大家都到处写“”,那么也是很可观的一笔开销。所以下次你绝对不要再用””,而一定要用vbNullString
“你说,是么,海蛇”,我轻蔑地看着它。
海蛇看到大家都恍然大悟的样子,再此发出了它的笑声(海蛇会笑么?)
“了解我,并不是真正的掌控我,很多C的潜水员会对VB不屑一顾,你们知道是为什么?”
“慢,VB的字符串操作太慢了”很多潜水者都回抢着回答这个问题。
“呵呵,是的,”海蛇放声大笑,慢慢地游向深海“I will Back!”
留下我们这群潜水的人,大家在思索,我们真正了解海蛇了么,因为VB海洋传说中海蛇是相当可怕的,它会这么轻易地走开么,而且,它所说的 I will Back又是指什么?
但是我们会继续下潜…….
“看,珊瑚礁”有人在惊呼!
VB 深度下潜之 海蛇缠绕相关推荐
- 行测-常识积累(2)
第三章 科技常识 第一节 中国古代科技成就 一.四大发明 造纸术 发明于西汉前期.公元 105 年,蔡伦造蔡侯纸 印刷术 1雕版印刷术发明于隋唐,868 年印刷的<金刚经>是世界上现存最早 ...
- 韩国三星现原形,不如华为有储备能抗压力,所谓技术大佬名不副实
源于陆新之财经新知 G20后,日本突然对韩国出手了.原因是韩国大法院做出日本企业要对强制征用劳工的受害者进行赔偿的判决后,日本政府或对韩国政府展开了经济报复. 日本政府准备了百余个报复筹码,现在开始用 ...
- 计算机专业男生礼物排行榜,男人内心最想收到的礼物,得票数最多的居然是这十个...
送礼物,并不是只有男人才有的"专利".很多时候,女生也会在送什么礼物给男人这个问题上挖空心思,大费周章.既要表达出特殊的情感关爱,还要考虑到对方是否喜欢和接受,到底送什么好呢,不妨 ...
- sdut-String-1 识蛟龙号载人深潜,立科技报国志
7-8 sdut-String-1 识蛟龙号载人深潜,立科技报国志(I) (10 分) 背景简介: "蛟龙号"载人深潜器是我国首台自主设计.自主集成研制的作业型深海载人潜水器,设计 ...
- 2021级-JAVA07 常用类(字符串)
7-1 sdut-String-3 字符串字母大小写转换逆序输出 编写程序,实现字符串中的字符大小写转换,并逆序输出. 输入格式: 输入一行字符串. 输出格式: 对字符串中的字母进行大小写转换,其余字 ...
- java题目集合第四部分(pta)
目录 7-1 sdut-Collection-sort--C~K的班级(II) 输入格式: 输出格式: 输入样例: 输出样例: 7-2 sdut-Map-Sort--C~K的班级(III) 输入格式: ...
- PTA 7-9 sdut-String-1 识蛟龙号载人深潜,立科技报国志(1)分数 10
背景简介: "蛟龙号"载人深潜器是我国首台自主设计.自主集成研制的作业型深海载人潜水器,设计最大下潜深度为7000米级,也是目前世界上下潜能力最强的作业型载人潜水器."蛟 ...
- nchu-software-oop-2022-4
nchu-software-oop-2022-4 前言 7-1 sdut-String-2 识蛟龙号载人深潜,立科技报国志(II)(正则表达式) 7-3 设计一个银行业务类 7-2 点线形系列4-凸四 ...
- 音质最好的半入耳式蓝牙耳机,音质最好的半入耳蓝牙耳机推荐
相信很多朋友都会在通勤的路上佩戴蓝牙耳机,听歌.刷视频或者打打游戏来消磨一下时间,但很多蓝牙耳机新手就会在挑选蓝牙耳机时面对如此多的牌子,往往不知道应该挑选哪个牌子的蓝牙耳机好,今天就来谈一谈蓝牙耳机 ...
最新文章
- SQL 注入真是防不胜防!
- php swoole yii,yii2-swoole
- vivado----fpga硬件调试 (三)----mark_debug
- 微软提供支持Windows 10预览版和EdgeHTML 14的预配置虚拟主机
- Source Insight上手教程
- Flutter获取随机数 Dart语言核心基础
- 这道考 switch 控制语句的阿里基础面试题你能答对吗?
- android jni 机器码,NDK构建
- 微信小程序启动过程分析
- 三菱GXWorks2 变换梯形图
- 【毕设狗】【单片机毕业设计】基于单片机的智能衣柜设计–实物设计
- C语言 —— 合并两个有序数组
- c语言实验报告模板电子版,C语言实验报告模板.doc
- 中国雅虎邮箱将寿终正寝 8月19日停止服务
- 一次旅行:汕尾-汕头-梅州
- 瑞芯微RK3568对比RK3399性能解析
- PyTorch入门: Kaggle 泰坦尼克幸存者预测
- win7纯净系统安装
- Ethereum Core Devs Meeting #83以太坊核心开发者会议纪要
- Zemax---Sequential and Non-Sequential模式(插图待补充)
热门文章
- transformjs 玩转星球
- 7-16 圆形体体积计算器 (10 分)
- Airpods连接到windows11突然没有声音了(已解决)
- (8)微信UI自动化-监控微信网络状态(C#)
- App Store预览视频制作(App Previews)
- Java中的时间与时区
- android webView 播放哔哩哔哩网页视频 几秒后或点击后空白
- 【JS继承】JS继承之原型链继承
- 指南针 linux版,i5/i7版本尽享400/600元优惠;华为 MateBook D系列Linux 版低至3599元
- FinalShell个人认为最牛逼的SSH工具