VB也能访问内存

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 samuelxp 的 blog

    有人说vb不能操作内存,效率低下,我不是太赞同.vb跟c比当然效率比较低下了,但是如果使用得当还是有不少的效率提高的.

     在开发windows上的应用时(注意啊,不是驱动),理论上来说,用vb可以做任何软件.因为vb本身没有的,可以使用api,而win32 api时可以实现windows上的任何应用功能的.当然这和使用者的功力有很大的关系,如果c/c++的功力很好,你甚至可以用vb实现内存拷贝的功能,因为long类型可以做指针.

     最近在做界面, 对vb有点研究, 给个例子吧.比如10进制转换2进制.

     用vb的一般用除法这么做:
public function o2b(byval long nvalue) as string
     dim nvaluecopy as long
     dim ntmp as byte '商
    dim sreturn as string '返回值
    nvaluecopy = nvalue

     '也有用nvalue - 2^n 方式的,这里就不多说了

    do while nvaluecopy > 0
          ntmp = nvaluecopy / 2          
          sreturn = cstr( nvaluecopy - ntmp / 2 ) & sreturn  '反向累计
        nvaluecopy = ntmp
     loop
 
     o2b = sreturn


end function

     而用c比较熟的人一般按位去做:
public function o2b(byref long nvalue) as string
     dim nbit( 0 to 7 ) as byte       ' 最小的单位是byte了,放掩码
    dim nbyte( 1 to 4 ) as byte     ' 分解nvalue到字节的
    dim ntmp as byte
     dim pvalue as long                ' 指针
     dim sreturn as string             ' 返回值
    dim i as byte, j as byte

     nbit(0) = 1            '00000001 
     nbit(1) = 2            '00000010
     nbit(2) = 4            '00000100
     nbit(3) = 8            '00001000
     nbit(4) = 16           '00010000
     nbit(5) = 32           '00100000
     nbit(6) = 64           '01000000
     nbit(7) = 128         '10000000

     ' 取 nvalue 的地址
     pvalue = varptr( nvalue )

     ' win32 api, 将nvalue的4个字节分别复制到nbyte中,byref 就相当于指针
    copymemory( nbyte(1), byref pvalue, 4 )

     for i = 4 to 1      '低字节在前
       for j = 7 to 0    '高位开始
         ' 方法一, 减法
         ntmp = 0
              if nbyte(i) > nbit(j) then
                  nbyte = nbyte(i) - nbit(j)
                  ntmp = 1           ' 这一位二进制是1
              end if
              sreturn = sreturn & cstr(ntmp)

              ' 方法二,按位与 效率更高
        ntmp = 1
              if ( not ( nbyte(i) imp nbit(j) ) ) = nbit(j) then
              ' 我没有找到vb按位与的函数,只有按位"同与"(不记得是不是)的imp
                   ntmp = 0
              end if
              sreturn = sreturn & cstr(ntmp)

     next j, i

     o2b = sreturn

end function

在网吧里,没有环境,随手写写,有错误请见谅,主要是思路.

本文关键:vb, 内存访问, 数据转换, 进制
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top