VB也能訪問記憶體 (轉)

worldblog發表於2007-12-12
VB也能訪問記憶體 (轉)[@more@]

  有人說vb不能操作,低下,我不是太贊同.vb跟c比當然效率比較低下了,但是如果使用得當還是有不少的效率提高的.

  在開發上的應用時(注意啊,不是),理論上來說,用vb可以做任何.因為vb本身沒有的,可以使用,而 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
    l
 
  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 = Vtr( 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

在裡,沒有環境,隨手寫寫,有錯誤請見諒,主要是思路.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991744/,如需轉載,請註明出處,否則將追究法律責任。

相關文章