明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

VB自定義數(shù)據(jù)結(jié)構(gòu)的傳輸轉(zhuǎn)換

[摘要]大連艦艇學(xué)院 孫永侃 ---- 用VB使用MSCOMM、WINSOCK等控件實現(xiàn)數(shù)據(jù)傳輸都方便,但這些控件提供的方法都只能傳輸字符串、Byte數(shù)組等,沒有提供用戶自定義數(shù)據(jù)結(jié)構(gòu)直接傳輸?shù)姆椒。但如?..
大連艦艇學(xué)院 孫永侃

---- 用VB使用MSCOMM、WINSOCK等控件實現(xiàn)數(shù)據(jù)傳輸都方便,但這些控件提供的方法都只能傳輸字符串、Byte數(shù)組等,沒有提供用戶自定義數(shù)據(jù)結(jié)構(gòu)直接傳輸?shù)姆椒。但如果解決了用戶自定義數(shù)據(jù)結(jié)構(gòu)與Byte數(shù)組的互相轉(zhuǎn)換,就自然可以實現(xiàn)用戶自定義數(shù)據(jù)結(jié)構(gòu)的傳輸了。目前我們使用的轉(zhuǎn)換方法主要是以下兩種方法:

---- (1)依靠磁盤文件實現(xiàn)轉(zhuǎn)換:把自定義數(shù)據(jù)結(jié)構(gòu)的變量(或Byte數(shù)組變量)存入一個用Binary方式打開的數(shù)據(jù)文件,然后用對應(yīng)字節(jié)數(shù)的Byte數(shù)組變量(或自定義數(shù)據(jù)結(jié)構(gòu)的變量)讀出,即可實現(xiàn)用戶自定義數(shù)據(jù)結(jié)構(gòu)與Byte數(shù)組的互相轉(zhuǎn)換。

---- (2)利用內(nèi)存拷貝實現(xiàn)轉(zhuǎn)換:用VC編寫內(nèi)存拷貝函數(shù),VB調(diào)用該函數(shù),實現(xiàn)用戶自定義數(shù)據(jù)結(jié)構(gòu)與Byte數(shù)組的互相轉(zhuǎn)換。

---- 現(xiàn)分別對這兩種方法的程序?qū)崿F(xiàn)詳細進行說明。

---- (一)程序定義說明

'用戶自定義的數(shù)據(jù)結(jié)構(gòu)
Type myDATE '該自定義的數(shù)據(jù)結(jié)構(gòu)可以任意復(fù)雜和嵌套
Bchar As Byte
fsingle As Single
End Type
Dim typeA As myDATE '定義自定義數(shù)據(jù)結(jié)構(gòu)變量
Dim bArray() As Byte '定義Byte數(shù)組變量
Dim MaxLenB As Long '定義確定Byte數(shù)組長度的值

'用內(nèi)存拷貝實現(xiàn)轉(zhuǎn)換還須如下轉(zhuǎn)換函數(shù)說明:
'實現(xiàn)Byte數(shù)組到用戶自定義數(shù)據(jù)結(jié)構(gòu)的轉(zhuǎn)換函數(shù)Copy_BA

Public Declare Function Copy_BA Lib
"copymem.dll" (ByRef pByte As Byte,
ByRef pData As myDATE, ByVal LONG cbSize)

'實現(xiàn)用戶自定義數(shù)據(jù)結(jié)構(gòu)到Byte數(shù)組的轉(zhuǎn)換函數(shù)Copy_AB

Public Declare Function Copy_AB Lib
" copymem.dll " (ByRef pData As myDATE,
ByRef pByte As Byte, ByVal LONG cbSize)

'其中copymem.dll為VC編寫的動態(tài)連接庫

---- (二)依靠磁盤文件實現(xiàn)轉(zhuǎn)換說明
MaxLenB = Len(typeA)
'其中Len()為VB提供的函數(shù),返回typeA寫至文件的大小。
'該例中 MaxLenB = 5
ReDim bArray(MaxLenB) As Byte
'用戶自定義數(shù)據(jù)結(jié)構(gòu)變量typeA存入文件C:\FNANE中
Open "C:\\ FNANE " For Binary As #1
Put #1, , typeA
Close #1
………..
'從文件C:\FNANE中讀出字節(jié)數(shù)組bArray (MaxLenB)
Open "C:\\ FNANE " For Binary As #1
Get #1, , bArray
Close #1

---- 以上就實現(xiàn)用戶自定義數(shù)據(jù)結(jié)構(gòu)typeA到Byte數(shù)組bArray()的轉(zhuǎn)換過程;若想實現(xiàn)Byte數(shù)組bArray()到自定義數(shù)據(jù)結(jié)構(gòu)typeA的轉(zhuǎn)換,只須用以上的方法存入bArray()、讀出typeA。該方法程序?qū)崿F(xiàn)簡單,但由于要讀寫磁盤文件,所以運行速度較慢。
---- (三)利用內(nèi)存拷貝實現(xiàn)轉(zhuǎn)換說明

MaxLenB = LenB(typeA)
'其中LenB()為VB提供的函數(shù),
返回typeA在內(nèi)存中的大小,包括元素之間的填塞。
'該例中 MaxLenB = 8
ReDim bArray (MaxLenB) As Byte
'實現(xiàn)用戶自定義數(shù)據(jù)結(jié)構(gòu)typeA到Byte數(shù)組bArray()的轉(zhuǎn)換
Call Copy_BA (bArray, typeA, MaxLenB)
'實現(xiàn)Byte數(shù)組bArray()到用戶自定義數(shù)據(jù)結(jié)構(gòu)typeA的轉(zhuǎn)換
Call Copy_AB (typeA,bArray, MaxLenB)

---- (四)用VC編寫內(nèi)存拷貝函數(shù)
用以下兩個函數(shù)編寫成動態(tài)連接庫:copymem.dll
void __stdcall copy_BA(LONG pMem,
LONG pSource, LONG cbSize)
{
memcpy((void*)pMem, (void*)pSource, cbSize);
}
void __stdcall copy_AB(LONG pMem, LONG pSource, LONG cbSize)
{
memcpy((void*)pMem, (void*)pSource, cbSize);